diff --git a/components/_util/hooks/useMergedState.ts b/components/_util/hooks/useMergedState.ts index 427c419d4..e18a9028d 100644 --- a/components/_util/hooks/useMergedState.ts +++ b/components/_util/hooks/useMergedState.ts @@ -1,4 +1,5 @@ import type { Ref, UnwrapRef } from 'vue'; +import { toRaw } from 'vue'; import { watchEffect } from 'vue'; import { unref } from 'vue'; import { watch } from 'vue'; @@ -36,7 +37,7 @@ export default function useMergedState>( function triggerChange(newValue: T) { const preVal = mergedValue.value; innerValue.value = newValue; - if (mergedValue.value !== newValue && option.onChange) { + if (toRaw(mergedValue.value) !== newValue && option.onChange) { option.onChange(newValue, preVal); } } diff --git a/components/date-picker/generatePicker/generateRangePicker.tsx b/components/date-picker/generatePicker/generateRangePicker.tsx index 1c513abd1..be96dd57c 100644 --- a/components/date-picker/generatePicker/generateRangePicker.tsx +++ b/components/date-picker/generatePicker/generateRangePicker.tsx @@ -47,9 +47,10 @@ export default function generateRangePicker(generateConfig: GenerateCo bordered = true, placeholder, suffixIcon = slots.suffixIcon?.(), + picker = 'date', ...restProps } = p; - const { format, showTime, picker } = p as any; + const { format, showTime } = p as any; let additionalOverrideProps: any = {}; @@ -76,6 +77,7 @@ export default function generateRangePicker(generateConfig: GenerateCo allowClear transitionName={`${rootPrefixCls.value}-slide-up`} {...additionalOverrideProps} + picker={picker} class={classNames( { [`${pre}-${size.value}`]: size.value, diff --git a/components/date-picker/index.tsx b/components/date-picker/index.tsx index f20f042d6..e917b5638 100755 --- a/components/date-picker/index.tsx +++ b/components/date-picker/index.tsx @@ -1,5 +1,5 @@ import type { Moment } from 'moment'; -import { App } from 'vue'; +import type { App } from 'vue'; import momentGenerateConfig from '../vc-picker/generate/moment'; import type { PickerProps, diff --git a/components/vc-picker/Picker.tsx b/components/vc-picker/Picker.tsx index 114d278a9..3be446ffd 100644 --- a/components/vc-picker/Picker.tsx +++ b/components/vc-picker/Picker.tsx @@ -566,7 +566,7 @@ function Picker() { inputReadOnly || typeof formatList.value[0] === 'function' || !typing.value } value={hoverValue.value || text.value} - onChange={(e: ChangeEvent) => { + onInput={(e: ChangeEvent) => { triggerTextChange(e.target.value); }} autofocus={autofocus} diff --git a/components/vc-picker/PickerPanel.tsx b/components/vc-picker/PickerPanel.tsx index 2054644a9..fd133e1ed 100644 --- a/components/vc-picker/PickerPanel.tsx +++ b/components/vc-picker/PickerPanel.tsx @@ -132,8 +132,8 @@ function PickerPanel() { defaultPickerValue: Object, disabledDate: Function, mode: String, - picker: String, - tabindex: [Number, String], + picker: { type: String, default: 'date' }, + tabindex: { type: [Number, String], default: 0 }, showNow: Boolean, showTime: Boolean, showToday: Boolean, @@ -430,7 +430,6 @@ function PickerPanel() { }; delete pickerProps.onChange; delete pickerProps.onSelect; - switch (mergedMode.value) { case 'decade': panelNode = ( diff --git a/components/vc-picker/RangePicker.tsx b/components/vc-picker/RangePicker.tsx index b077ff701..b71b4f786 100644 --- a/components/vc-picker/RangePicker.tsx +++ b/components/vc-picker/RangePicker.tsx @@ -983,9 +983,8 @@ function RangerPicker() { }); if (picker !== 'time' && !showTime) { - const viewDate = mergedActivePickerIndex.value - ? startViewDate.value - : endViewDate.value; + const viewDate = + mergedActivePickerIndex.value === 0 ? startViewDate.value : endViewDate.value; const nextViewDate = getClosingViewDate(viewDate, picker, generateConfig); const currentMode = mergedModes.value[mergedActivePickerIndex.value]; @@ -1166,7 +1165,7 @@ function RangerPicker() { inputReadOnly || typeof formatList.value[0] === 'function' || !startTyping.value } value={startHoverValue.value || startText.value} - onChange={(e: ChangeEvent) => { + onInput={(e: ChangeEvent) => { triggerStartTextChange(e.target.value); }} autofocus={autofocus} @@ -1193,7 +1192,7 @@ function RangerPicker() { inputReadOnly || typeof formatList.value[0] === 'function' || !endTyping.value } value={endHoverValue.value || endText.value} - onChange={(e: ChangeEvent) => { + onInput={(e: ChangeEvent) => { triggerEndTextChange(e.target.value); }} placeholder={getValue(placeholder, 1) || ''} diff --git a/components/vc-picker/hooks/useRangeViewDates.ts b/components/vc-picker/hooks/useRangeViewDates.ts index 14112bb4f..274c295c9 100644 --- a/components/vc-picker/hooks/useRangeViewDates.ts +++ b/components/vc-picker/hooks/useRangeViewDates.ts @@ -2,7 +2,8 @@ import type { RangeValue, PickerMode } from '../interface'; import type { GenerateConfig } from '../generate'; import { getValue, updateValues } from '../utils/miscUtil'; import { getClosingViewDate, isSameYear, isSameMonth, isSameDecade } from '../utils/dateUtil'; -import type { ComputedRef, Ref } from 'vue'; +import type { Ref } from 'vue'; +import { watch } from 'vue'; import { computed } from 'vue'; import { ref } from 'vue'; @@ -73,11 +74,7 @@ export default function useRangeViewDates({ picker: Ref; defaultDates: RangeValue | undefined; generateConfig: Ref>; -}): [ - ComputedRef, - ComputedRef, - (viewDate: DateType | null, index: 0 | 1) => void, -] { +}): [Ref, Ref, (viewDate: DateType | null, index: 0 | 1) => void] { const defaultViewDates = ref<[DateType | null, DateType | null]>([ getValue(defaultDates, 0), getValue(defaultDates, 1), @@ -86,7 +83,7 @@ export default function useRangeViewDates({ const startDate = computed(() => getValue(values.value, 0)); const endDate = computed(() => getValue(values.value, 1)); - function getViewDate(index: 0 | 1): DateType { + const getViewDate = (index: 0 | 1): DateType => { // If set default view date, use it if (defaultViewDates.value[index]) { return defaultViewDates.value[index]! as DateType; @@ -99,14 +96,19 @@ export default function useRangeViewDates({ endDate.value || generateConfig.value.getNow() ); - } - const startViewDate = computed(() => { - return getViewDate(0); - }); + }; - const endViewDate = computed(() => { - return getViewDate(1); - }); + const startViewDate = ref(null); + + const endViewDate = ref(null); + watch( + viewDates, + () => { + startViewDate.value = getViewDate(0); + endViewDate.value = getViewDate(1); + }, + { immediate: true }, + ); function setViewDate(viewDate: DateType | null, index: 0 | 1) { if (viewDate) {