fix(components): el-select-allow-dynamically-update-options (#6473)

* fix(components):[select] (#6458)

* fix(components): [select] allow create

* fix(components): [select] allow create code review
This commit is contained in:
gjfei 2022-03-10 15:50:46 +08:00 committed by GitHub
parent 0d6cfc60b8
commit 3cc4867f7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 7 deletions

View File

@ -729,6 +729,46 @@ describe('Select', () => {
expect((wrapper.vm as any).value).toBe('new')
})
test('allow create async option', async () => {
const options = [
{
value: '选项1',
label: '黄金糕',
},
{
value: '选项2',
label: '双皮奶',
},
]
wrapper = _mount(
`
<el-select
v-model="value"
filterable
allowCreate
>
<el-option
v-for="item in options"
:label="item.label"
:key="item.value"
:value="item.value">
</el-option>
</el-select>
`,
() => ({
options: [],
value: '选项2',
})
)
await nextTick()
expect(getOptions()).toHaveLength(1)
await wrapper.setData({
options,
})
expect(getOptions()).toHaveLength(options.length)
})
test('multiple select', async () => {
wrapper = getSelectVm({ multiple: true })
await wrapper.find('.select-trigger').trigger('click')

View File

@ -69,15 +69,14 @@ export default defineComponent({
onBeforeUnmount(() => {
const { selected } = select
const selectedOptions = select.props.multiple ? selected : [selected]
const doesExist = select.cachedOptions.has(key)
const doesSelected = selectedOptions.some((item) => {
return item.value === (vm as unknown as SelectOptionProxy).value
})
// if option is not selected, remove it from cache
if (doesExist && !doesSelected) {
if (select.cachedOptions.get(key) === vm && !doesSelected) {
select.cachedOptions.delete(key)
}
select.onOptionDestroy(key)
select.onOptionDestroy(key, vm)
})
function selectOptionClick() {

View File

@ -670,10 +670,12 @@ export const useSelect = (props, states: States, ctx) => {
states.cachedOptions.set(vm.value, vm)
}
const onOptionDestroy = (key) => {
states.optionsCount--
states.filteredOptionsCount--
states.options.delete(key)
const onOptionDestroy = (key, vm: SelectOptionProxy) => {
if (states.options.get(key) === vm) {
states.optionsCount--
states.filteredOptionsCount--
states.options.delete(key)
}
}
const resetInputState = (e: KeyboardEvent) => {