fix(components): [date-picker] change triggers twice when clearing (#19804)

* fix(components): [date-picker] change triggers twice when clearing

* fix(components): [date-picker] change triggers twice when clearing

* fix(components): [date-picker] add test

* fix(components): [date-picker] add test

* fix(components): [date-picker] add test

* fix(components): [date-picker] add test
This commit is contained in:
xingyixiang
2025-03-03 15:47:34 +08:00
committed by GitHub
parent 7d59595def
commit f932ea2dcb
2 changed files with 38 additions and 1 deletions

View File

@@ -899,6 +899,41 @@ describe('DatePicker', () => {
expect(popper.getAttribute('aria-hidden')).toBe('false')
})
})
describe('Trigger the change event when clearing the date picker', () => {
it('click the button to clear the date', async () => {
const changeHandler = vi.fn()
const wrapper = _mount(
`<el-date-picker
v-model="value"
@change="changeHandler"
/>`,
() => ({ value: new Date(), changeHandler })
)
await wrapper.find('input').trigger('focus')
await wrapper.find('.el-input').trigger('mouseenter')
await wrapper.find('.clear-icon').trigger('click')
expect(changeHandler).toHaveBeenCalledTimes(1)
})
it('manually clear date', async () => {
const changeHandler = vi.fn()
const wrapper = _mount(
`<el-date-picker
v-model="value"
@change="changeHandler"
/>`,
() => ({ value: new Date(), changeHandler })
)
const input = wrapper.find('input')
await input.trigger('focus')
await input.setValue('')
await input.trigger('blur')
expect(changeHandler).toHaveBeenCalledTimes(1)
})
})
})
describe('DatePicker Navigation', () => {

View File

@@ -292,6 +292,8 @@ const emitChange = (
// determine user real change only
if (isClear || !valueEquals(val, valueOnOpen.value)) {
emit('change', val)
// Set the value of valueOnOpen when clearing to avoid triggering change events multiple times.
isClear && (valueOnOpen.value = val)
props.validateEvent &&
formItem?.validate('change').catch((err) => debugWarn(err))
}
@@ -540,7 +542,7 @@ const handleChange = () => {
}
if (userInput.value === '') {
emitInput(valueOnClear.value)
emitChange(valueOnClear.value)
emitChange(valueOnClear.value, true)
userInput.value = null
}
}