From 949479699bc5158633edeb861dc2a00637a94952 Mon Sep 17 00:00:00 2001 From: qiang Date: Wed, 7 Aug 2024 18:35:30 +0800 Subject: [PATCH] refactor(hooks): determine the focus by event listening (#17719) * refactor(hooks): determine the focus by event listening * test: skip the focus test * test: fix test * feat(hooks): add beforeFocus * fix: optimize blur * chore(components): [mention] remove focus & blur --- .../__tests__/autocomplete.test.tsx | 2 +- .../__tests__/color-picker.test.tsx | 2 +- .../color-picker/src/color-picker.vue | 22 +--- packages/components/input/src/input.vue | 21 +-- packages/components/mention/src/mention.vue | 4 +- .../select-v2/__tests__/select.test.ts | 25 ++-- packages/components/select-v2/src/select.vue | 2 - .../components/select-v2/src/useSelect.ts | 41 +++--- .../select/__tests__/select.test.ts | 37 +++--- packages/components/select/src/select.vue | 2 - packages/components/select/src/useSelect.ts | 41 +++--- .../__tests__/use-focus-controller.test.tsx | 120 ++++++++++++------ packages/hooks/use-focus-controller/index.ts | 47 +++++-- 13 files changed, 206 insertions(+), 160 deletions(-) diff --git a/packages/components/autocomplete/__tests__/autocomplete.test.tsx b/packages/components/autocomplete/__tests__/autocomplete.test.tsx index 04e9464d10..68a965cdfa 100644 --- a/packages/components/autocomplete/__tests__/autocomplete.test.tsx +++ b/packages/components/autocomplete/__tests__/autocomplete.test.tsx @@ -443,7 +443,7 @@ describe('Autocomplete.vue', () => { await wrapper.find('input').trigger('blur') vi.runAllTimers() await nextTick() - expect(onBlur).toHaveBeenCalledTimes(1) + expect(onBlur).toHaveBeenCalled() }) describe('test a11y supports', () => { diff --git a/packages/components/color-picker/__tests__/color-picker.test.tsx b/packages/components/color-picker/__tests__/color-picker.test.tsx index 13858363e0..c3a3917b2a 100644 --- a/packages/components/color-picker/__tests__/color-picker.test.tsx +++ b/packages/components/color-picker/__tests__/color-picker.test.tsx @@ -495,7 +495,7 @@ describe('Color-picker', () => { expect(focusHandler).toHaveBeenCalledTimes(1) await wrapper.find('.el-color-picker').trigger('blur') - expect(blurHandler).toHaveBeenCalledTimes(1) + expect(blurHandler).toHaveBeenCalled() wrapper.unmount() }) }) diff --git a/packages/components/color-picker/src/color-picker.vue b/packages/components/color-picker/src/color-picker.vue index d7d02b1fa5..b08c090ed8 100644 --- a/packages/components/color-picker/src/color-picker.vue +++ b/packages/components/color-picker/src/color-picker.vue @@ -171,11 +171,10 @@ const popper = ref() const triggerRef = ref() const inputRef = ref() -const { - isFocused, - handleFocus: _handleFocus, - handleBlur, -} = useFocusController(triggerRef, { +const { isFocused, handleFocus, handleBlur } = useFocusController(triggerRef, { + beforeFocus() { + return colorDisabled.value + }, beforeBlur(event) { return popper.value?.isFocusInsideContent(event) }, @@ -185,11 +184,6 @@ const { }, }) -const handleFocus = (event: FocusEvent) => { - if (colorDisabled.value) return blur() - _handleFocus(event) -} - // active-change is used to prevent modelValue changes from triggering. let shouldActiveChange = true @@ -315,14 +309,10 @@ function clear() { resetColor() } -function handleClickOutside(event: Event) { +function handleClickOutside() { if (!showPicker.value) return hide() - - if (isFocused.value) { - const _event = new FocusEvent('focus', event) - handleBlur(_event) - } + isFocused.value && focus() } function handleEsc(event: KeyboardEvent) { diff --git a/packages/components/input/src/input.vue b/packages/components/input/src/input.vue index 011a3ab800..a713f89560 100644 --- a/packages/components/input/src/input.vue +++ b/packages/components/input/src/input.vue @@ -52,8 +52,6 @@ @compositionupdate="handleCompositionUpdate" @compositionend="handleCompositionEnd" @input="handleInput" - @focus="handleFocus" - @blur="handleBlur" @change="handleChange" @keydown="handleKeydown" /> @@ -132,8 +130,6 @@ @compositionupdate="handleCompositionUpdate" @compositionend="handleCompositionEnd" @input="handleInput" - @focus="handleFocus" - @blur="handleBlur" @change="handleChange" @keydown="handleKeydown" /> @@ -261,16 +257,13 @@ const textareaCalcStyle = shallowRef(props.inputStyle) const _ref = computed(() => input.value || textarea.value) -const { wrapperRef, isFocused, handleFocus, handleBlur } = useFocusController( - _ref, - { - afterBlur() { - if (props.validateEvent) { - elFormItem?.validate?.('blur').catch((err) => debugWarn(err)) - } - }, - } -) +const { wrapperRef, isFocused } = useFocusController(_ref, { + afterBlur() { + if (props.validateEvent) { + elFormItem?.validate?.('blur').catch((err) => debugWarn(err)) + } + }, +}) const needStatusIcon = computed(() => elForm?.statusIcon ?? false) const validateState = computed(() => elFormItem?.validateState || '') diff --git a/packages/components/mention/src/mention.vue b/packages/components/mention/src/mention.vue index 4b02d292bd..3c47659825 100644 --- a/packages/components/mention/src/mention.vue +++ b/packages/components/mention/src/mention.vue @@ -6,8 +6,6 @@ :model-value="modelValue" @input="handleInputChange" @keydown="handleInputKeyDown" - @focus="handleFocus" - @blur="handleBlur" @mousedown="handleInputMouseDown" >