feat(components): [select & select-v2] explicit export selectedLabel (#18350)

* feat(components): [select] export selectedLabel

* docs: update

* docs: update th

* docs: update selectedLabel version
This commit is contained in:
sea 2024-10-11 13:48:12 +08:00 committed by GitHub
parent 8908e738e5
commit 1f82e8ca61
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 107 additions and 8 deletions

View File

@ -299,7 +299,8 @@ select-v2/custom-label
### Exposes ### Exposes
| Method | Description | Type | | Name | Description | Type |
| ------ | ----------------------------------------------- | ----------------------- | | ---------------------- | ----------------------------------------------- | ------------------------------------------ |
| focus | focus the Input component | ^[Function]`() => void` | | focus | focus the Input component | ^[Function]`() => void` |
| blur | blur the Input component, and hide the dropdown | ^[Function]`() => void` | | blur | blur the Input component, and hide the dropdown | ^[Function]`() => void` |
| selectedLabel ^(2.8.5) | get the currently selected label | ^[object]`ComputedRef<string \| string[]>` |

View File

@ -264,10 +264,11 @@ select/custom-label
### Select Exposes ### Select Exposes
| Method | Description | Type | | Name | Description | Type |
| ------ | ----------------------------------------------- | ----------------------- | | ---------------------- | ----------------------------------------------- | ------------------------------------------ |
| focus | focus the Input component | ^[Function]`() => void` | | focus | focus the Input component | ^[Function]`() => void` |
| blur | blur the Input component, and hide the dropdown | ^[Function]`() => void` | | blur | blur the Input component, and hide the dropdown | ^[Function]`() => void` |
| selectedLabel ^(2.8.5) | get the currently selected label | ^[object]`ComputedRef<string \| string[]>` |
## Option Group API ## Option Group API

View File

@ -533,6 +533,42 @@ describe('Select', () => {
) )
}) })
describe('expose', () => {
it('select label', async () => {
const wrapper = createSelect({
data: () => {
return {
options: [
{ value: 'value1', label: 'label1' },
{ value: 'value2', label: 'label2' },
],
multiple: false,
value: '',
}
},
})
await nextTick()
const select = wrapper.findComponent(Select)
const selectVm = select.vm as any
const vm = wrapper.vm as any
const options = getOptions()
options[0].click()
expect(selectVm.selectedLabel).toBe('label1')
vm.value = 'value2'
await nextTick()
expect(selectVm.selectedLabel).toBe('label2')
vm.multiple = true
vm.value = []
await nextTick()
expect(selectVm.selectedLabel).toStrictEqual([])
vm.value = ['value1', 'value2']
await nextTick()
expect(selectVm.selectedLabel).toStrictEqual(['label1', 'label2'])
})
})
describe('multiple', () => { describe('multiple', () => {
it('multiple select', async () => { it('multiple select', async () => {
const wrapper = createSelect({ const wrapper = createSelect({

View File

@ -329,9 +329,17 @@ export default defineComponent({
onKeyboardSelect: API.onKeyboardSelect, onKeyboardSelect: API.onKeyboardSelect,
}) })
const selectedLabel = computed(() => {
if (!props.multiple) {
return API.states.selectedLabel
}
return API.states.cachedOptions.map((i) => i.label as string)
})
return { return {
...API, ...API,
modelValue, modelValue,
selectedLabel,
} }
}, },
}) })

View File

@ -380,6 +380,51 @@ describe('Select', () => {
expect(wrapper.find(`.${PLACEHOLDER_CLASS_NAME}`).text()).toBe('双皮奶') expect(wrapper.find(`.${PLACEHOLDER_CLASS_NAME}`).text()).toBe('双皮奶')
}) })
test('expose select label', async () => {
wrapper = _mount(
`
<el-select v-model="value" :multiple="multiple">
<el-option
v-for="item in options"
:label="item.label"
:key="item.value"
:value="item.value">
</el-option>
</el-select>
`,
() => ({
options: [
{ value: '选项1', label: '黄金糕' },
{ value: '选项2', label: '双皮奶' },
],
value: '选项2',
multiple: false,
})
)
await nextTick()
const select = wrapper.findComponent({ name: 'ElSelect' })
const vm = wrapper.vm as any
const selectVm = select.vm as any
expect(selectVm.selectedLabel).toBe('双皮奶')
const options = getOptions()
options[0].click()
await nextTick()
expect(selectVm.selectedLabel).toBe('黄金糕')
vm.value = ''
await nextTick()
expect(selectVm.selectedLabel).toBe('')
vm.value = []
vm.multiple = true
await nextTick()
expect(selectVm.selectedLabel).toStrictEqual([])
vm.value = ['选项1', '选项2']
await nextTick()
expect(selectVm.selectedLabel).toStrictEqual(['黄金糕', '双皮奶'])
})
test('set default value to object', async () => { test('set default value to object', async () => {
wrapper = _mount( wrapper = _mount(
` `

View File

@ -369,9 +369,17 @@ export default defineComponent({
}) as unknown as SelectContext }) as unknown as SelectContext
) )
const selectedLabel = computed(() => {
if (!props.multiple) {
return API.states.selectedLabel
}
return API.states.selected.map((i) => i.currentLabel as string)
})
return { return {
...API, ...API,
modelValue, modelValue,
selectedLabel,
} }
}, },
}) })