diff --git a/packages/time-picker/__tests__/time-picker.spec.ts b/packages/time-picker/__tests__/time-picker.spec.ts index a840ac71c2..0029ab15c0 100644 --- a/packages/time-picker/__tests__/time-picker.spec.ts +++ b/packages/time-picker/__tests__/time-picker.spec.ts @@ -128,6 +128,49 @@ describe('TimePicker', () => { expect(vm.value instanceof Date).toBeTruthy() }) + it('should update oldValue when visible change', async () => { + const wrapper = _mount(``, () => ({ value: new Date(2016, 9, 10, 18, 40) })) + + // show picker panel + const input = wrapper.find('input') + input.trigger('blur') + input.trigger('focus') + await nextTick() + + // select time + const list = document.querySelectorAll('.el-time-spinner__list') + const hoursEl = list[0] + const minutesEl = list[1] + const secondsEl = list[2] + const hourEl = hoursEl.querySelectorAll('.el-time-spinner__item')[4] as any + const minuteEl = minutesEl.querySelectorAll('.el-time-spinner__item')[36] as any + const secondEl = secondsEl.querySelectorAll('.el-time-spinner__item')[20] as any + hourEl.click() + await nextTick() + minuteEl.click() + await nextTick() + secondEl.click() + await nextTick(); + + // click confirm button + (document.querySelector('.el-time-panel__btn.confirm') as any).click() + const date = (wrapper.vm as any).value + expect(date.getHours()).toBe(4) + expect(date.getMinutes()).toBe(36) + expect(date.getSeconds()).toBe(20) + + // show picker panel and click cancel button + input.trigger('blur') + input.trigger('focus') + await nextTick(); + (document.querySelector('.el-time-panel__btn.cancel') as any).click() + expect(date.getHours()).toBe(4) + expect(date.getMinutes()).toBe(36) + expect(date.getSeconds()).toBe(20) + }) + it('set format', async () => { const wrapper = _mount(` { return props.actualVisible === undefined ? 'el-zoom-in-top' : '' diff --git a/packages/time-picker/src/time-picker-com/panel-time-range.vue b/packages/time-picker/src/time-picker-com/panel-time-range.vue index b7089738b3..fb2bac7016 100644 --- a/packages/time-picker/src/time-picker-com/panel-time-range.vue +++ b/packages/time-picker/src/time-picker-com/panel-time-range.vue @@ -79,7 +79,7 @@ import union from 'lodash/union' import { t } from '@element-plus/locale' import { EVENT_CODE } from '@element-plus/utils/aria' import TimeSpinner from './basic-time-spinner.vue' -import { getAvaliableArrs } from './useTimePicker' +import { getAvaliableArrs, useOldValue } from './useTimePicker' const makeSelectRange = (start, end) => { const result = [] @@ -109,7 +109,7 @@ export default defineComponent({ setup(props, ctx) { const minDate = computed(() => props.parsedValue[0]) const maxDate = computed(() => props.parsedValue[1]) - const oldValue = ref(props.parsedValue) + const oldValue = useOldValue(props) const handleCancel = () => { ctx.emit('pick', oldValue.value, null) } diff --git a/packages/time-picker/src/time-picker-com/useTimePicker.ts b/packages/time-picker/src/time-picker-com/useTimePicker.ts index a46f39fa1d..4cd495b605 100644 --- a/packages/time-picker/src/time-picker-com/useTimePicker.ts +++ b/packages/time-picker/src/time-picker-com/useTimePicker.ts @@ -1,3 +1,6 @@ +import { ref, watch } from 'vue' +import { Dayjs } from 'dayjs' + const makeList = (total, method, methodFunc) => { const arr = [] const disabledArr = method && methodFunc() @@ -61,3 +64,18 @@ export const getAvaliableArrs = (disabledHours, disabledMinutes, disabledSeconds getAvaliableSeconds, } } + +export const useOldValue = (props: { + parsedValue?: string | Dayjs | Dayjs[] + visible: boolean +}) => { + const oldValue = ref(props.parsedValue) + + watch(() => props.visible, val => { + if (!val) { + oldValue.value = props.parsedValue + } + }) + + return oldValue +}