From 8ddbb1d85a706e9a2fce3aeeb347fc0346949f86 Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Wed, 21 May 2025 13:54:59 +0800 Subject: [PATCH] fix(components): [select] select value label rendering error (#20769) * fix(components): [select] select value label rendering error * chore: comment * fix: update * fix: update * feat: manual render * refactor: immediate watch * test: update * test: with multiple --- .../select/__tests__/select.test.ts | 146 +++++++++++++++++- packages/components/select/src/select.vue | 32 +++- packages/components/tooltip/src/content.vue | 4 +- typings/env.d.ts | 1 + 4 files changed, 176 insertions(+), 7 deletions(-) diff --git a/packages/components/select/__tests__/select.test.ts b/packages/components/select/__tests__/select.test.ts index a43b077e80..07b7154ae1 100644 --- a/packages/components/select/__tests__/select.test.ts +++ b/packages/components/select/__tests__/select.test.ts @@ -1,7 +1,7 @@ // @ts-nocheck import { defineComponent, markRaw, nextTick, ref } from 'vue' import { mount } from '@vue/test-utils' -import { afterEach, describe, expect, it, test, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, test, vi } from 'vitest' import { EVENT_CODE } from '@element-plus/constants' import { ArrowDown, CaretTop, CircleClose } from '@element-plus/icons-vue' import { usePopperContainerId } from '@element-plus/hooks' @@ -307,11 +307,17 @@ const WRAPPER_CLASS_NAME = 'el-select__wrapper' const OPTION_ITEM_CLASS_NAME = 'el-select-dropdown__item' const PLACEHOLDER_CLASS_NAME = 'el-select__placeholder' const DEFAULT_PLACEHOLDER = 'Select' +const TAG_NAME = `${WRAPPER_CLASS_NAME} .el-tag` describe('Select', () => { let wrapper: ReturnType + beforeEach(() => { + // This is convenient for testing the default value label rendering when persistent is false. + process.env.RUN_TEST_FILE_NAME = 'select' + }) afterEach(() => { document.body.innerHTML = '' + delete process.env.RUN_TEST_FILE_NAME }) test('create', async () => { @@ -380,6 +386,140 @@ describe('Select', () => { expect(wrapper.find(`.${PLACEHOLDER_CLASS_NAME}`).text()).toBe('双皮奶') }) + test('the scenario of rendering label when there is a default value and persistent is false', async () => { + wrapper = _mount( + ` + + + + + `, + () => ({ + options: [ + { + value: '选项1', + label: '黄金糕', + }, + { + value: '选项2', + label: '双皮奶', + }, + ], + value: '选项2', + }) + ) + await nextTick() + + expect(wrapper.find(`.${PLACEHOLDER_CLASS_NAME}`).text()).toBe('双皮奶') + }) + + test('when there is a default value and persistent is false, render the label and dynamically modify options', async () => { + wrapper = _mount( + ` + + + + + `, + () => ({ + options: [], + value: '选项2', + }) + ) + await nextTick() + const vm = wrapper.vm as any + vm.options = [ + { + value: '选项1', + label: '黄金糕', + }, + { + value: '选项2', + label: '双皮奶', + }, + ] + await nextTick() + + expect(wrapper.find(`.${PLACEHOLDER_CLASS_NAME}`).text()).toBe('双皮奶') + }) + + test('multiple is true and persistent is false', async () => { + wrapper = _mount( + ` + + + + + `, + () => ({ + options: [ + { + value: '选项1', + label: '黄金糕', + }, + { + value: '选项2', + label: '双皮奶', + }, + ], + value: ['选项2'], + }) + ) + await nextTick() + + const tags = wrapper.findAll(`.${TAG_NAME}`) + expect(tags.length).toBe(1) + expect(tags[0].text()).toBe('双皮奶') + }) + + test('multiple is true and persistent is false, render the label and dynamically modify options', async () => { + wrapper = _mount( + ` + + + + + `, + () => ({ + options: [], + value: ['选项2'], + }) + ) + await nextTick() + const vm = wrapper.vm as any + vm.options = [ + { + value: '选项1', + label: '黄金糕', + }, + { + value: '选项2', + label: '双皮奶', + }, + ] + await nextTick() + + const tags = wrapper.findAll(`.${TAG_NAME}`) + expect(tags.length).toBe(1) + expect(tags[0].text()).toBe('双皮奶') + }) + test('expose select label', async () => { wrapper = _mount( ` @@ -1291,8 +1431,8 @@ describe('Select', () => { const triggerWrappers = wrapper.findAll('.el-tooltip__trigger') expect(triggerWrappers[0]).toBeDefined() const tags = document.querySelectorAll('.el-select__tags-text') - expect(tags.length).toBe(4) - expect(tags[3].textContent).toBe('蚵仔煎') + expect(tags.length).toBe(2) + expect(tags[1].textContent).toBe(' + 2') }) test('multiple select with maxCollapseTags', async () => { diff --git a/packages/components/select/src/select.vue b/packages/components/select/src/select.vue index 1595319fab..1191fdd799 100644 --- a/packages/components/select/src/select.vue +++ b/packages/components/select/src/select.vue @@ -300,14 +300,14 @@