diff --git a/.changeset/chilled-ladybugs-invite.md b/.changeset/chilled-ladybugs-invite.md new file mode 100644 index 0000000000..3074d919a0 --- /dev/null +++ b/.changeset/chilled-ladybugs-invite.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: dynamic event delegation for stateful call expressions diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js index 84c0ad0ed5..a1ae1fba9a 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js @@ -1169,7 +1169,11 @@ function serialize_event_handler(node, { state, visit }) { } else { handler = /** @type {Expression} */ (visit(handler)); } - } else if (handler.type === 'ConditionalExpression' || handler.type === 'LogicalExpression') { + } else if ( + handler.type === 'CallExpression' || + handler.type === 'ConditionalExpression' || + handler.type === 'LogicalExpression' + ) { handler = dynamic_handler(); } else { handler = /** @type {Expression} */ (visit(handler)); diff --git a/packages/svelte/tests/runtime-runes/samples/dynamic-hof-delegated-event/_config.js b/packages/svelte/tests/runtime-runes/samples/dynamic-hof-delegated-event/_config.js new file mode 100644 index 0000000000..cb37111379 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dynamic-hof-delegated-event/_config.js @@ -0,0 +1,24 @@ +import { flushSync } from 'svelte'; +import { test, ok } from '../../test'; + +export default test({ + mode: ['client'], + async test({ assert, target, logs }) { + const [btn1, btn2, btn3] = target.querySelectorAll('button'); + + flushSync(() => { + btn1.click(); + btn2.click(); + }); + + assert.deepEqual(logs, ['AA', 'AB']); + + flushSync(() => { + btn3.click(); + btn1.click(); + btn2.click(); + }); + + assert.deepEqual(logs, ['AA', 'AB', 'BA', 'BB']); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/dynamic-hof-delegated-event/main.svelte b/packages/svelte/tests/runtime-runes/samples/dynamic-hof-delegated-event/main.svelte new file mode 100644 index 0000000000..9f6f1c1fef --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dynamic-hof-delegated-event/main.svelte @@ -0,0 +1,15 @@ + + + + + +
+