Skip to content

Commit 1f973b1

Browse files
fix: remove spreaded event handlers when they become nullish (#14546)
Fixes #14539
1 parent 4c4f18b commit 1f973b1

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

.changeset/itchy-cooks-yawn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: remove spreaded event handlers when they become nullish

packages/svelte/src/internal/client/dom/elements/attributes.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,9 @@ export function set_attributes(
281281
element[`__${event_name}`] = value;
282282
delegate([event_name]);
283283
}
284+
} else if (delegated) {
285+
// @ts-ignore
286+
element[`__${event_name}`] = undefined;
284287
}
285288
} else if (key === 'style' && value != null) {
286289
element.style.cssText = value + '';
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { ok, test } from '../../test';
2+
import { flushSync } from 'svelte';
3+
4+
export default test({
5+
async test({ assert, target, instance }) {
6+
const p = target.querySelector('p');
7+
const btn = target.querySelector('button');
8+
const input = target.querySelector('input');
9+
ok(p);
10+
11+
flushSync(() => {
12+
btn?.click();
13+
});
14+
assert.equal(p.innerHTML, '1');
15+
16+
flushSync(() => {
17+
input?.click();
18+
});
19+
flushSync(() => {
20+
btn?.click();
21+
});
22+
assert.equal(p.innerHTML, '1');
23+
24+
flushSync(() => {
25+
input?.click();
26+
});
27+
flushSync(() => {
28+
btn?.click();
29+
});
30+
assert.equal(p.innerHTML, '2');
31+
}
32+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script>
2+
let checked = $state(true)
3+
let count = $state(0)
4+
5+
const onclick = $derived(checked ? (() => { count++ }) : undefined)
6+
</script>
7+
8+
<p>
9+
{count}
10+
</p>
11+
<input type="checkbox" bind:checked />
12+
<button {...{onclick}}></button>

0 commit comments

Comments
 (0)