Skip to content

Commit 055e7a8

Browse files
fix: properly update svelte:component props when there are spread props (#10604)
fixes #10602
1 parent 314c3d4 commit 055e7a8

File tree

6 files changed

+27
-7
lines changed

6 files changed

+27
-7
lines changed

.changeset/popular-wombats-try.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: properly update `svelte:component` props when there are spread props

packages/svelte/src/compiler/compile/render_dom/wrappers/InlineComponent/index.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,13 @@ export default class InlineComponentWrapper extends Wrapper {
277277
// statements will become switch_props function body
278278
// rewrite last statement, add props update logic
279279
statements[statements.length - 1] = b`
280+
for (let #i = 0; #i < ${levels}.length; #i += 1) {
281+
${props} = @assign(${props}, ${levels}[#i]);
282+
}
280283
if (#dirty !== undefined && ${condition}) {
281-
${props} = @get_spread_update(${levels}, [
284+
${props} = @assign(${props}, @get_spread_update(${levels}, [
282285
${changes}
283-
]);
284-
} else {
285-
for (let #i = 0; #i < ${levels}.length; #i += 1) {
286-
${props} = @assign(${props}, ${levels}[#i]);
287-
}
286+
]));
288287
}
289288
`;
290289
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<script>
22
export let value;
3+
export let foo;
4+
export let cb;
35
</script>
46

57
<p>value(1) = {value}</p>
8+
<p>foo={foo}</p>
9+
<p>typeof cb={typeof cb}</p>
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<script>
22
export let value;
3+
export let foo;
4+
export let cb;
35
</script>
46

57
<p>value(2) = {value}</p>
8+
<p>foo={foo}</p>
9+
<p>typeof cb={typeof cb}</p>

packages/svelte/test/runtime/samples/dynamic-component-spread-props/_config.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
export default {
22
html: `
33
<p>value(1) = 1</p>
4+
<p>foo=bar</p>
5+
<p>typeof cb=function</p>
46
<button>Toggle Component</button>
57
`,
68

@@ -11,6 +13,8 @@ export default {
1113
target.innerHTML,
1214
`
1315
<p>value(2) = 2</p>
16+
<p>foo=bar</p>
17+
<p>typeof cb=function</p>
1418
<button>Toggle Component</button>
1519
`
1620
);
@@ -19,6 +23,8 @@ export default {
1923
target.innerHTML,
2024
`
2125
<p>value(1) = 1</p>
26+
<p>foo=bar</p>
27+
<p>typeof cb=function</p>
2228
<button>Toggle Component</button>
2329
`
2430
);

packages/svelte/test/runtime/samples/dynamic-component-spread-props/main.svelte

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
let view = Comp1;
66
77
$: props = view === Comp1 ? { value: 1 } : { value: 2 };
8+
const bar = "bar";
9+
function cb() {}
810
</script>
911

10-
<svelte:component this={view} {...props} />
12+
<svelte:component this={view} {...props} foo={bar} {cb} />
1113

1214
<button on:click={(e) => (view = view === Comp1 ? Comp2 : Comp1)}>Toggle Component</button>

0 commit comments

Comments
 (0)