diff --git a/.changeset/smooth-weeks-hide.md b/.changeset/smooth-weeks-hide.md new file mode 100644 index 000000000000..dc982561eb85 --- /dev/null +++ b/.changeset/smooth-weeks-hide.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: only `select_option` if `'value'` is in `next` diff --git a/packages/svelte/src/internal/client/dom/elements/attributes.js b/packages/svelte/src/internal/client/dom/elements/attributes.js index 6cfc123cc251..fcce0b444f49 100644 --- a/packages/svelte/src/internal/client/dom/elements/attributes.js +++ b/packages/svelte/src/internal/client/dom/elements/attributes.js @@ -486,7 +486,7 @@ export function attribute_effect( set_attributes(element, prev, next, css_hash, skip_warning); - if (inited && is_select) { + if (inited && is_select && 'value' in next) { select_option(/** @type {HTMLSelectElement} */ (element), next.value, false); } diff --git a/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js new file mode 100644 index 000000000000..71802ba6de9a --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js @@ -0,0 +1,20 @@ +import { flushSync } from 'svelte'; +import { ok, test } from '../../test'; + +export default test({ + async test({ assert, target }) { + const select = target.querySelector('select'); + ok(select); + const [option1, option2] = select; + + assert.ok(option1.selected); + assert.ok(!option2.selected); + + const btn = target.querySelector('button'); + flushSync(() => { + btn?.click(); + }); + assert.ok(option1.selected); + assert.ok(!option2.selected); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte new file mode 100644 index 000000000000..fb1f7ddf9614 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte @@ -0,0 +1,10 @@ + + + + +