refactor: calendar

pull/4499/head
tangjinzhou 2021-08-09 10:59:01 +08:00
parent 95acde2856
commit 16f0d49c84
5 changed files with 61 additions and 35 deletions

View File

@ -115,13 +115,32 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
setup(props, { emit, slots, attrs }) {
const { prefixCls, direction } = useConfigInject('picker', props);
const calendarPrefixCls = computed(() => `${prefixCls.value}-calendar`);
const maybeToString = (date: DateType) => {
return props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date;
};
const value = computed(() => {
if (props.value) {
return props.valueFormat
? (generateConfig.toDate(props.value, props.valueFormat) as DateType)
: (props.value as DateType);
}
return props.value as DateType;
});
const defaultValue = computed(() => {
if (props.defaultValue) {
return props.valueFormat
? (generateConfig.toDate(props.defaultValue, props.valueFormat) as DateType)
: (props.defaultValue as DateType);
}
return props.defaultValue as DateType;
});
// Value
const [mergedValue, setMergedValue] = useMergedState(
() => props.value || generateConfig.getNow(),
() => value.value || generateConfig.getNow(),
{
defaultValue: props.defaultValue,
value: toRef(props, 'value'),
defaultValue: defaultValue.value,
value: value,
},
);
@ -144,7 +163,7 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
// ====================== Events ======================
const triggerPanelChange = (date: DateType, newMode: CalendarMode) => {
emit('panelChange', date, newMode);
emit('panelChange', maybeToString(date), newMode);
};
const triggerChange = (date: DateType) => {
@ -158,8 +177,9 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
) {
triggerPanelChange(date, mergedMode.value);
}
emit('update:value', date);
emit('change', date);
const val = maybeToString(date);
emit('update:value', val);
emit('change', val);
}
};
@ -170,7 +190,7 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
const onInternalSelect = (date: DateType) => {
triggerChange(date);
emit('select', date);
emit('select', maybeToString(date));
};
// ====================== Locale ======================
const defaultLocale = computed(() => {

View File

@ -73,10 +73,11 @@ export default function generateRangePicker<DateType>(
pickerRef.value?.blur();
},
});
const maybeToStrings = (dates: DateType[]) => {
return props.valueFormat ? generateConfig.toString(dates, props.valueFormat) : dates;
};
const onChange = (dates: [DateType, DateType], dateStrings: [string, string]) => {
const values = props.valueFormat
? generateConfig.toString(dates, props.valueFormat)
: dates;
const values = maybeToStrings(dates);
emit('update:value', values);
emit('change', values, dateStrings);
};
@ -91,15 +92,11 @@ export default function generateRangePicker<DateType>(
emit('blur');
};
const onPanelChange = (dates: RangeValue<DateType>, modes: [PanelMode, PanelMode]) => {
const values = props.valueFormat
? generateConfig.toString(dates, props.valueFormat)
: dates;
const values = maybeToStrings(dates);
emit('panelChange', values, modes);
};
const onOk = (dates: DateType) => {
const value = props.valueFormat
? generateConfig.toString(dates, props.valueFormat)
: dates;
const onOk = (dates: DateType[]) => {
const value = maybeToStrings(dates);
emit('ok', value);
};
const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = (
@ -107,9 +104,7 @@ export default function generateRangePicker<DateType>(
dateStrings: [string, string],
info,
) => {
const values = props.valueFormat
? generateConfig.toString(dates, props.valueFormat)
: dates;
const values = maybeToStrings(dates);
emit('calendarChange', values, dateStrings, info);
};
const [contextLocale] = useLocaleReceiver('DatePicker', enUS);

View File

@ -82,8 +82,11 @@ export default function generatePicker<DateType>(
pickerRef.value?.blur();
},
});
const maybeToString = (date: DateType) => {
return props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date;
};
const onChange = (date: DateType, dateString: string) => {
const value = props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date;
const value = maybeToString(date);
emit('update:value', value);
emit('change', value, dateString);
};
@ -98,11 +101,11 @@ export default function generatePicker<DateType>(
emit('blur');
};
const onPanelChange = (date: DateType, mode: PanelMode | null) => {
const value = props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date;
const value = maybeToString(date);
emit('panelChange', value, mode);
};
const onOk = (date: DateType) => {
const value = props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date;
const value = maybeToString(date);
emit('ok', value);
};

View File

@ -139,7 +139,7 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
},
});
const onChange = (
values: [DateType, DateType] | [string, string],
values: RangeValue<string> | RangeValue<DateType>,
dateStrings: [string, string],
) => {
emit('update:value', values);
@ -156,16 +156,16 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
emit('blur');
};
const onPanelChange = (
values: string | RangeValue<DateType>,
values: RangeValue<string> | RangeValue<DateType>,
modes: [PanelMode, PanelMode],
) => {
emit('panelChange', values, modes);
};
const onOk = (value: DateType) => {
emit('ok', value);
const onOk = (values: RangeValue<string> | RangeValue<DateType>) => {
emit('ok', values);
};
const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = (
values: [DateType, DateType] | [string, string],
values: RangeValue<string> | RangeValue<DateType>,
dateStrings: [string, string],
info,
) => {

View File

@ -1,19 +1,27 @@
<template>
<a-calendar v-model:value="value" @panelChange="onPanelChange" />
<a-alert :message="`You selected date: ${selectedValue && selectedValue.format('YYYY-MM-DD')}`" />
<a-calendar :value="date" @select="onSelect" @panelChange="onPanelChange" />
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { Dayjs } from 'dayjs';
import dayjs, { Dayjs } from 'dayjs';
export default defineComponent({
setup() {
const value = ref<Dayjs>();
const onPanelChange = (value: Dayjs, mode: string) => {
console.log(value, mode);
};
const date = ref(dayjs('2017-01-25'));
const selectedValue = ref(dayjs('2017-01-25'));
const onSelect = (value: Dayjs) => {
date.value = value;
selectedValue.value = value;
};
const onPanelChange = (value: Dayjs) => {
date.value = value;
};
return {
value,
date,
selectedValue,
onSelect,
onPanelChange,
};
},