From 3c76fc36d7d4c042e3a838e6d9df4c84816b5392 Mon Sep 17 00:00:00 2001
From: mengxiong10 <15623530290@163.com>
Date: Thu, 5 Dec 2019 11:01:57 +0800
Subject: [PATCH] fix: prop `lang` should be reactive (#391)
---
__test__/locale.test.js | 9 ++++++++-
src/calendar/calendar-panel.vue | 13 ++++++++++---
src/calendar/table-date.vue | 18 +++++++++++-------
src/calendar/table-month.vue | 8 ++++++--
src/date-picker.vue | 7 +++++--
src/locale.js | 27 +++++++++++++++++++++++++++
src/mixin/format.js | 11 -----------
src/mixin/locale.js | 28 ----------------------------
src/time/list-options.vue | 17 ++++++++++++-----
src/time/time-panel.vue | 23 +++++++++++++++--------
10 files changed, 94 insertions(+), 67 deletions(-)
delete mode 100644 src/mixin/format.js
delete mode 100644 src/mixin/locale.js
diff --git a/__test__/locale.test.js b/__test__/locale.test.js
index 8e79a0d..ecd2eda 100644
--- a/__test__/locale.test.js
+++ b/__test__/locale.test.js
@@ -30,7 +30,14 @@ describe('Locale', () => {
},
});
expect(wrapper.find('.mx-table-date th').text()).toBe('Su');
- expect(wrapper.find('.mx-table-date td').element.title).toBe('Sep 29, 2019');
+ expect(wrapper.find('.mx-table-month td').text()).toBe('Jan');
+ expect(wrapper.find('.mx-btn-current-month').text()).toBe('Oct');
+ expect(wrapper.find('.mx-table-date .active').element.title).toBe('Oct 10, 2019');
+ wrapper.setProps({ lang: 'zh-cn' });
+ expect(wrapper.find('.mx-table-date th').text()).toBe('δΈ');
+ expect(wrapper.find('.mx-table-month td').text()).toBe('1ζ');
+ expect(wrapper.find('.mx-btn-current-month').text()).toBe('10ζ');
+ expect(wrapper.find('.mx-table-date .active').element.title).toBe('10ζ 10, 2019');
});
it('prop: lang - object', () => {
diff --git a/src/calendar/calendar-panel.vue b/src/calendar/calendar-panel.vue
index 565d7eb..b1d7267 100644
--- a/src/calendar/calendar-panel.vue
+++ b/src/calendar/calendar-panel.vue
@@ -106,12 +106,12 @@ import {
startOfMonth,
startOfDay,
} from 'date-fns';
-import localeMixin from '../mixin/locale';
-import formatMixin from '../mixin/format';
+import { format } from 'date-format-parse';
import { getValidDate, isValidDate, createDate } from '../util/date';
import TableDate from './table-date';
import TableMonth from './table-month';
import TableYear from './table-year';
+import { getLocaleFieldValue } from '../locale';
export default {
name: 'CalendarPanel',
@@ -120,7 +120,11 @@ export default {
TableMonth,
TableYear,
},
- mixins: [localeMixin, formatMixin],
+ inject: {
+ t: {
+ default: () => getLocaleFieldValue,
+ },
+ },
props: {
value: {},
defaultValue: {
@@ -222,6 +226,9 @@ export default {
},
},
methods: {
+ formatDate(date, fmt) {
+ return format(date, fmt, { locale: this.t('formatLocale') });
+ },
initCalendar() {
let calendarDate = this.calendar;
if (!isValidDate(calendarDate)) {
diff --git a/src/calendar/table-date.vue b/src/calendar/table-date.vue
index 234331d..0990ed1 100644
--- a/src/calendar/table-date.vue
+++ b/src/calendar/table-date.vue
@@ -27,18 +27,19 @@
diff --git a/src/locale.js b/src/locale.js
index 8d29d1d..7394b4f 100644
--- a/src/locale.js
+++ b/src/locale.js
@@ -20,6 +20,33 @@ export function locale(name, object, isLocal) {
return locales[name] || locales[defaultLocale];
}
+/**
+ * get locale object
+ * @param {string} name lang
+ */
export function getLocale(name) {
return locale(name, null, true);
}
+
+/**
+ * get locale field value
+ * @param {string} field field eg: 'formatLocale.shortMonth'
+ * @param {object} lang locale object
+ */
+export function getLocaleFieldValue(field, lang) {
+ const arr = (field || '').split('.');
+ let current = lang || getLocale();
+ let value;
+ for (let i = 0, len = arr.length; i < len; i++) {
+ const prop = arr[i];
+ value = current[prop];
+ if (i === len - 1) {
+ return value;
+ }
+ if (!value) {
+ return null;
+ }
+ current = value;
+ }
+ return null;
+}
diff --git a/src/mixin/format.js b/src/mixin/format.js
deleted file mode 100644
index c65de04..0000000
--- a/src/mixin/format.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { format } from 'date-format-parse';
-import LocaleMixin from './locale';
-
-export default {
- mixins: [LocaleMixin],
- methods: {
- formatDate(date, fmt) {
- return format(date, fmt, { locale: this.t('formatLocale') });
- },
- },
-};
diff --git a/src/mixin/locale.js b/src/mixin/locale.js
deleted file mode 100644
index b6a085a..0000000
--- a/src/mixin/locale.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { getLocale } from '../locale';
-
-export default {
- inject: {
- locale: {
- default: getLocale(),
- },
- },
- methods: {
- t(path) {
- const arr = path.split('.');
- let current = this.locale || getLocale();
- let value;
- for (let i = 0, len = arr.length; i < len; i++) {
- const prop = arr[i];
- value = current[prop];
- if (i === len - 1) {
- return value;
- }
- if (!value) {
- return null;
- }
- current = value;
- }
- return null;
- },
- },
-};
diff --git a/src/time/list-options.vue b/src/time/list-options.vue
index 330d512..c810eb5 100644
--- a/src/time/list-options.vue
+++ b/src/time/list-options.vue
@@ -13,10 +13,10 @@