tweak implementation

svelte-html
Simon Holthausen 9 months ago
parent 0a9594913c
commit 8f8a5b10df

@ -22,16 +22,22 @@ export function svelte_html(get_attributes) {
attributes = get_attributes();
for (const name in attributes) {
const current = (current_setters[name] ??= []);
const idx = current.findIndex(([owner]) => owner === own);
const old = idx === -1 ? null : current.splice(idx, 1)[0][1];
let value = attributes[name];
current_setters[name] = (current_setters[name] ?? []).filter(([owner]) => owner !== own);
current_setters[name].unshift([own, value]);
current.push([own, value]);
// Do nothing on initial render during hydration: If there are attribute duplicates, the last value
// wins, which could result in needless hydration repairs from earlier values.
if (hydrating) continue;
if (name === 'class') {
set_class(node, current_setters[name].map(([_, value]) => value).join(' '));
// Avoid unrelated attribute changes from triggering class changes
if (old !== value) {
set_class(node, current_setters[name].map(([_, text]) => text).join(' '));
}
} else {
set_attribute(node, name, value);
}
@ -45,9 +51,11 @@ export function svelte_html(get_attributes) {
const current = current_setters[name];
if (name === 'class') {
set_class(node, current.map(([_, value]) => value).join(' '));
} else if (old[0][0] === own) {
set_attribute(node, name, current[0]?.[1]);
set_class(node, current.map(([_, text]) => text).join(' '));
// If this was the last one setting this attribute, revert to the previous value
} else if (old[old.length - 1][0] === own) {
set_attribute(node, name, current[current.length - 1]?.[1]);
}
}
});

Loading…
Cancel
Save