diff --git a/.changeset/wicked-bikes-matter.md b/.changeset/wicked-bikes-matter.md new file mode 100644 index 000000000000..ef97021e0f22 --- /dev/null +++ b/.changeset/wicked-bikes-matter.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: optimize `bind:group` diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/input.js b/packages/svelte/src/internal/client/dom/elements/bindings/input.js index d9ec022dd07b..ca83d90f2014 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/input.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/input.js @@ -53,8 +53,11 @@ export function bind_value(input, get_value, update) { }); } +/** @type {Set} */ +const pending = new Set(); + /** - * @param {Array} inputs + * @param {HTMLInputElement[]} inputs * @param {null | [number]} group_index * @param {HTMLInputElement} input * @param {() => unknown} get_value @@ -127,10 +130,17 @@ export function bind_group(inputs, group_index, input, get_value, update) { } }); - queue_micro_task(() => { - // necessary to maintain binding group order in all insertion scenarios. TODO optimise - binding_group.sort((a, b) => (a.compareDocumentPosition(b) === 4 ? -1 : 1)); + if (!pending.has(binding_group)) { + pending.add(binding_group); + queue_micro_task(() => { + // necessary to maintain binding group order in all insertion scenarios + binding_group.sort((a, b) => (a.compareDocumentPosition(b) === 4 ? -1 : 1)); + pending.delete(binding_group); + }); + } + + queue_micro_task(() => { if (hydration_mismatch) { var value;