Skip to content

Commit 2fa095b

Browse files
authored
fix: improve spreading of attributes (#11177)
* fix: improve spreading of attributes * twak
1 parent d061f2f commit 2fa095b

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

.changeset/nervous-turkeys-end.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: improve spreading of attributes

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ export function set_attributes(element, prev, attrs, lowercase_attributes, css_h
104104
var setters = map_get(setters_cache, element.nodeName);
105105
if (!setters) map_set(setters_cache, element.nodeName, (setters = get_setters(element)));
106106

107+
// @ts-expect-error
108+
var attributes = /** @type {Record<string, unknown>} **/ (element.__attributes ??= {});
109+
107110
for (key in next) {
108111
var value = next[key];
109112
if (value === prev?.[key]) continue;
@@ -140,6 +143,7 @@ export function set_attributes(element, prev, attrs, lowercase_attributes, css_h
140143
}
141144
}
142145
} else if (value == null) {
146+
attributes[key] = null;
143147
element.removeAttribute(key);
144148
} else if (key === 'style') {
145149
element.style.cssText = value + '';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, target }) {
6+
const btn = target.querySelector('button');
7+
8+
flushSync(() => {
9+
btn?.click();
10+
});
11+
12+
assert.htmlEqual(target.innerHTML, `<button>Toggle</button><h1>Style: not red</h1>`);
13+
14+
flushSync(() => {
15+
btn?.click();
16+
});
17+
18+
assert.htmlEqual(
19+
target.innerHTML,
20+
`<button>Toggle</button><h1 data-red="true">Style: red</h1>`
21+
);
22+
}
23+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
let isRed = $state(true)
3+
4+
const attributes = $derived({
5+
'data-red': isRed ? true : undefined
6+
});
7+
</script>
8+
9+
<button onclick={() => isRed = !isRed }>Toggle</button>
10+
11+
<h1 {...attributes}>Style: {isRed ? 'red' : 'not red'}</h1>

0 commit comments

Comments
 (0)