From 2dca78bd7675035a9f2c177ec756da8cfbaa7a7b Mon Sep 17 00:00:00 2001 From: Zhong Date: Sat, 25 Oct 2025 17:58:21 +0800 Subject: [PATCH] fix(components): [select] scrolling is not triggered when the option value is zero (#22578) * fix(components): [select] scroll missing when first option value is zero * test: add case * test: update --- .../select/__tests__/select.test.ts | 42 +++++++++++++++++++ packages/components/select/src/useSelect.ts | 4 +- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/components/select/__tests__/select.test.ts b/packages/components/select/__tests__/select.test.ts index d96e99d70e..bdcde000b0 100644 --- a/packages/components/select/__tests__/select.test.ts +++ b/packages/components/select/__tests__/select.test.ts @@ -3740,4 +3740,46 @@ describe('Select', () => { await input.trigger('click') expect(selectVm.dropdownMenuVisible).toBeTruthy() }) + + test('should trigger scroll when option value is 0', async () => { + wrapper = _mount( + ` + + + `, + () => ({ + options: Array.from({ length: 10 }).map((_, i) => ({ + label: `label-${i}`, + value: i, + })), + value: '', + }) + ) + + const select = wrapper.findComponent({ name: 'ElSelect' }) + const selectVm = select.vm as any + const wrapEl = wrapper.find('.el-select-dropdown__wrap').element + const optionEls = wrapper.findAll('.el-select-dropdown__item') + const cleanup = optionEls.map((item, i) => + vi.spyOn(item.element, 'offsetTop', 'get').mockReturnValue(i * 30) + ) + cleanup.push( + vi.spyOn(wrapEl, 'clientHeight', 'get').mockReturnValue(5 * 30) + ) + + const input = wrapper.find('input') + await input.trigger('click') + await input.trigger('keydown', { key: EVENT_CODE.up }) + expect(selectVm.states.hoveringIndex).toBe(9) + expect(wrapEl.scrollTop).toBe(4 * 30) + await input.trigger('keydown', { key: EVENT_CODE.down }) + expect(selectVm.states.hoveringIndex).toBe(0) + expect(wrapEl.scrollTop).toBe(0) + cleanup.forEach((fn) => fn()) + }) }) diff --git a/packages/components/select/src/useSelect.ts b/packages/components/select/src/useSelect.ts index cfd04ebb89..76e245d21f 100644 --- a/packages/components/select/src/useSelect.ts +++ b/packages/components/select/src/useSelect.ts @@ -7,7 +7,7 @@ import { watch, watchEffect, } from 'vue' -import { findLastIndex, get, isEqual } from 'lodash-unified' +import { findLastIndex, get, isEqual, isNil } from 'lodash-unified' import { useDebounceFn, useResizeObserver } from '@vueuse/core' import { ValidateComponentsMap, @@ -611,7 +611,7 @@ export const useSelect = (props: SelectProps, emit: SelectEmits) => { const targetOption = isArray(option) ? option[0] : option let target = null - if (targetOption?.value) { + if (!isNil(targetOption?.value)) { const options = optionsArray.value.filter( (item) => item.value === targetOption.value )