diff --git a/.changeset/tidy-select-spreads.md b/.changeset/tidy-select-spreads.md new file mode 100644 index 0000000000..3b14dc5d34 --- /dev/null +++ b/.changeset/tidy-select-spreads.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: preserve select selection when spread attributes omit value diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/select.js b/packages/svelte/src/internal/client/dom/elements/bindings/select.js index eb26062653..e390e23ea0 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/select.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/select.js @@ -56,8 +56,10 @@ export function select_option(select, value, mounting = false) { */ export function init_select(select) { var observer = new MutationObserver(() => { - // @ts-ignore - select_option(select, select.__value); + if ('__value' in select) { + // @ts-ignore + select_option(select, select.__value); + } // Deliberately don't update the potential binding value, // the model should be preserved unless explicitly changed }); diff --git a/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/_config.js b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/_config.js new file mode 100644 index 0000000000..8bc2f11e26 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/_config.js @@ -0,0 +1,25 @@ +import { flushSync } from 'svelte'; +import { ok, test } from '../../test'; + +export default test({ + mode: ['client', 'hydrate'], + + async test({ assert, component, target }) { + const select = target.querySelector('select'); + ok(select); + + assert.equal(select.selectedIndex, 0); + + component.toggle(); + flushSync(); + await Promise.resolve(); + + assert.equal(select.selectedIndex, 0); + + component.toggle(); + flushSync(); + await Promise.resolve(); + + assert.equal(select.selectedIndex, 0); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/main.svelte b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/main.svelte new file mode 100644 index 0000000000..229ce4fb73 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/main.svelte @@ -0,0 +1,16 @@ + + +