diff --git a/.changeset/popular-wombats-try.md b/.changeset/popular-wombats-try.md new file mode 100644 index 000000000000..ae8ca9364734 --- /dev/null +++ b/.changeset/popular-wombats-try.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: properly update `svelte:component` props when there are spread props diff --git a/packages/svelte/src/compiler/compile/render_dom/wrappers/InlineComponent/index.js b/packages/svelte/src/compiler/compile/render_dom/wrappers/InlineComponent/index.js index d5cf8341dcdd..e29050bdc588 100644 --- a/packages/svelte/src/compiler/compile/render_dom/wrappers/InlineComponent/index.js +++ b/packages/svelte/src/compiler/compile/render_dom/wrappers/InlineComponent/index.js @@ -277,14 +277,13 @@ export default class InlineComponentWrapper extends Wrapper { // statements will become switch_props function body // rewrite last statement, add props update logic statements[statements.length - 1] = b` + for (let #i = 0; #i < ${levels}.length; #i += 1) { + ${props} = @assign(${props}, ${levels}[#i]); + } if (#dirty !== undefined && ${condition}) { - ${props} = @get_spread_update(${levels}, [ + ${props} = @assign(${props}, @get_spread_update(${levels}, [ ${changes} - ]); - } else { - for (let #i = 0; #i < ${levels}.length; #i += 1) { - ${props} = @assign(${props}, ${levels}[#i]); - } + ])); } `; } diff --git a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp1.svelte b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp1.svelte index d4fe28a8a370..e87e7ec69912 100644 --- a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp1.svelte +++ b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp1.svelte @@ -1,5 +1,9 @@

value(1) = {value}

+

foo={foo}

+

typeof cb={typeof cb}

diff --git a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp2.svelte b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp2.svelte index 07d41f3d8464..06c4c7acfe74 100644 --- a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp2.svelte +++ b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/Comp2.svelte @@ -1,5 +1,9 @@

value(2) = {value}

+

foo={foo}

+

typeof cb={typeof cb}

diff --git a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/_config.js b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/_config.js index d5ba1ef64b58..c09efb851bc7 100644 --- a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/_config.js +++ b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/_config.js @@ -1,6 +1,8 @@ export default { html: `

value(1) = 1

+

foo=bar

+

typeof cb=function

`, @@ -11,6 +13,8 @@ export default { target.innerHTML, `

value(2) = 2

+

foo=bar

+

typeof cb=function

` ); @@ -19,6 +23,8 @@ export default { target.innerHTML, `

value(1) = 1

+

foo=bar

+

typeof cb=function

` ); diff --git a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/main.svelte b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/main.svelte index b8c45c83a084..082ebbcda26e 100644 --- a/packages/svelte/test/runtime/samples/dynamic-component-spread-props/main.svelte +++ b/packages/svelte/test/runtime/samples/dynamic-component-spread-props/main.svelte @@ -5,8 +5,10 @@ let view = Comp1; $: props = view === Comp1 ? { value: 1 } : { value: 2 }; + const bar = "bar"; + function cb() {} - +