fix(components): [input] blur event fails when using textarea (#17836)

closed #17825
This commit is contained in:
qiang 2024-08-10 11:02:28 +08:00 committed by GitHub
parent 6d773919e7
commit dc8cb90130
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 62 additions and 10 deletions

View File

@ -331,21 +331,67 @@ describe('Input.vue', () => {
const handleFocus = vi.fn()
const handleBlur = vi.fn()
test('event:focus & blur', async () => {
test('event:focus', async () => {
const content = ref('')
const wrapper = mount(() => (
<Input
placeholder="请输入内容"
modelValue={content.value}
onFocus={handleFocus}
onBlur={handleBlur}
/>
))
const input = wrapper.find('input')
await input.trigger('focus')
expect(handleFocus).toBeCalled()
expect(handleFocus).toHaveBeenCalledOnce()
})
test('event:blur', async () => {
const content = ref('')
const wrapper = mount(() => (
<Input
placeholder="请输入内容"
modelValue={content.value}
onBlur={handleBlur}
/>
))
const input = wrapper.find('input')
await input.trigger('blur')
expect(handleBlur).toHaveBeenCalledOnce()
})
test('textarea & event:focus', async () => {
const content = ref('')
const wrapper = mount(() => (
<Input
type="textarea"
placeholder="请输入内容"
modelValue={content.value}
onFocus={handleFocus}
/>
))
const input = wrapper.find('textarea')
await input.trigger('focus')
expect(handleFocus).toHaveBeenCalledOnce()
})
test('textarea & event:blur', async () => {
const content = ref('')
const wrapper = mount(() => (
<Input
type="textarea"
placeholder="请输入内容"
modelValue={content.value}
onBlur={handleBlur}
/>
))
const input = wrapper.find('textarea')
await input.trigger('blur')
expect(handleBlur).toBeCalled()

View File

@ -130,6 +130,8 @@
@compositionupdate="handleCompositionUpdate"
@compositionend="handleCompositionEnd"
@input="handleInput"
@focus="handleFocus"
@blur="handleBlur"
@change="handleChange"
@keydown="handleKeydown"
/>
@ -257,13 +259,17 @@ const textareaCalcStyle = shallowRef(props.inputStyle)
const _ref = computed(() => input.value || textarea.value)
const { wrapperRef, isFocused } = useFocusController(_ref, {
afterBlur() {
if (props.validateEvent) {
elFormItem?.validate?.('blur').catch((err) => debugWarn(err))
}
},
})
// wrapperRef for type="text", handleFocus and handleBlur for type="textarea"
const { wrapperRef, isFocused, handleFocus, handleBlur } = useFocusController(
_ref,
{
afterBlur() {
if (props.validateEvent) {
elFormItem?.validate?.('blur').catch((err) => debugWarn(err))
}
},
}
)
const needStatusIcon = computed(() => elForm?.statusIcon ?? false)
const validateState = computed(() => elFormItem?.validateState || '')