From: zongxi1115 <107086465+zongxi1115@users.noreply.github.com> Date: Thu, 16 Jul 2026 00:16:35 +0000 (+0800) Subject: fix(runtime-dom): respect current select model type (#15010) X-Git-Tag: v3.5.40~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb89e935a771ab7fc3f8e67a82bc8fc7ea28bdaa;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-dom): respect current select model type (#15010) close #15009 --- diff --git a/packages/runtime-dom/__tests__/directives/vModel.spec.ts b/packages/runtime-dom/__tests__/directives/vModel.spec.ts index 2b78b0c617..590c0d7df2 100644 --- a/packages/runtime-dom/__tests__/directives/vModel.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vModel.spec.ts @@ -1317,6 +1317,54 @@ describe('vModel', () => { expect(bar.selected).toEqual(true) }) + it('multiple select uses current Array/Set model type', async () => { + const component = defineComponent({ + data() { + return { value: [] } + }, + render() { + return [ + withVModel( + h( + 'select', + { + value: null, + multiple: true, + 'onUpdate:modelValue': setValue.bind(this), + }, + [h('option', { value: 'foo' }), h('option', { value: 'bar' })], + ), + this.value, + ), + ] + }, + }) + render(h(component), root) + + const input = root.querySelector('select') + const foo = root.querySelector('option[value=foo]') + const bar = root.querySelector('option[value=bar]') + const data = root._vnode.component.data + + data.value = new Set(['foo']) + await nextTick() + foo.selected = true + bar.selected = true + triggerEvent('change', input) + await nextTick() + expect(data.value).toBeInstanceOf(Set) + expect(data.value).toMatchObject(new Set(['foo', 'bar'])) + + data.value = ['foo'] + await nextTick() + foo.selected = false + bar.selected = true + triggerEvent('change', input) + await nextTick() + expect(Array.isArray(data.value)).toBe(true) + expect(data.value).toMatchObject(['bar']) + }) + it('multiple select (model is Set, option value is object)', async () => { const fooValue = { foo: 1 } const barValue = { bar: 1 } diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index b49bf809e2..766db6bfe6 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -207,7 +207,7 @@ export const vModelSelect: ModelDirective = { //