diff --git a/src/compile/render-dom/wrappers/InlineComponent/index.ts b/src/compile/render-dom/wrappers/InlineComponent/index.ts index bc13014a29..870296a035 100644 --- a/src/compile/render-dom/wrappers/InlineComponent/index.ts +++ b/src/compile/render-dom/wrappers/InlineComponent/index.ts @@ -112,7 +112,6 @@ export default class InlineComponentWrapper extends Wrapper { const statements: string[] = []; const updates: string[] = []; - const postupdates: string[] = []; let props; const name_changes = block.get_unique_name(`${name}_changes`); @@ -311,8 +310,6 @@ export default class InlineComponentWrapper extends Wrapper { } `); - postupdates.push(updating); - const contextual_dependencies = Array.from(binding.expression.contextual_dependencies); const dependencies = Array.from(binding.expression.dependencies); @@ -333,9 +330,9 @@ export default class InlineComponentWrapper extends Wrapper { block.builders.init.add_block(deindent` function ${name}(value) { - if (ctx.${name}.call(null, value, ctx)) { - ${updating} = true; - } + ctx.${name}.call(null, value, ctx); + ${updating} = true; + @add_flush_callback(() => ${updating} = false); } `); @@ -343,9 +340,9 @@ export default class InlineComponentWrapper extends Wrapper { } else { block.builders.init.add_block(deindent` function ${name}(value) { - if (ctx.${name}.call(null, value)) { - ${updating} = true; - } + ctx.${name}.call(null, value); + ${updating} = true; + @add_flush_callback(() => ${updating} = false); } `); } @@ -353,7 +350,7 @@ export default class InlineComponentWrapper extends Wrapper { const body = deindent` function ${name}(${args.join(', ')}) { ${lhs} = value; - return ${component.invalidate(dependencies[0])} + ${component.invalidate(dependencies[0])}; } `; @@ -452,8 +449,6 @@ export default class InlineComponentWrapper extends Wrapper { else if (${switch_value}) { ${name}.$set(${name_changes}); } - - ${postupdates.length > 0 && `${postupdates.join(' = ')} = false;`} `); } @@ -497,7 +492,6 @@ export default class InlineComponentWrapper extends Wrapper { block.builders.update.add_block(deindent` ${updates} ${name}.$set(${name_changes}); - ${postupdates.length > 0 && `${postupdates.join(' = ')} = false;`} `); } diff --git a/src/internal/Component.js b/src/internal/Component.js index a0be4b9895..530a48da59 100644 --- a/src/internal/Component.js +++ b/src/internal/Component.js @@ -85,15 +85,9 @@ export function init(component, options, instance, create_fragment, not_equal, p $$.ctx = instance ? instance(component, props, (key, value) => { - if ($$.ctx) { - const changed = not_equal(value, $$.ctx[key]); - if (ready && changed) { - if ($$.bound[key]) $$.bound[key](value); - make_dirty(component, key); - } - - $$.ctx[key] = value; - return changed; + if ($$.ctx && not_equal($$.ctx[key], $$.ctx[key] = value)) { + if ($$.bound[key]) $$.bound[key](value); + if (ready) make_dirty(component, key); } }) : props; diff --git a/src/internal/scheduler.js b/src/internal/scheduler.js index b2b5bd5200..bc4f01197b 100644 --- a/src/internal/scheduler.js +++ b/src/internal/scheduler.js @@ -7,6 +7,7 @@ export const intros = { enabled: false }; let update_promise; const binding_callbacks = []; const render_callbacks = []; +const flush_callbacks = []; export function schedule_update() { if (!update_promise) { @@ -15,10 +16,6 @@ export function schedule_update() { } } -export function add_render_callback(fn) { - render_callbacks.push(fn); -} - export function tick() { schedule_update(); return update_promise; @@ -28,6 +25,14 @@ export function add_binding_callback(fn) { binding_callbacks.push(fn); } +export function add_render_callback(fn) { + render_callbacks.push(fn); +} + +export function add_flush_callback(fn) { + flush_callbacks.push(fn); +} + export function flush() { const seen_callbacks = new Set(); @@ -56,6 +61,10 @@ export function flush() { } } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_promise = null; } diff --git a/test/runtime/samples/component-binding-blowback-d/One.svelte b/test/runtime/samples/component-binding-blowback-d/One.svelte index e2e86b1bf7..f86da72ff2 100644 --- a/test/runtime/samples/component-binding-blowback-d/One.svelte +++ b/test/runtime/samples/component-binding-blowback-d/One.svelte @@ -2,14 +2,15 @@ import Two from './Two.svelte'; export let list; + export let i; function handle_click() { list = [...list, {}]; } -{#each list as item} - +{#each list as item, j} + {/each} -

{"value":"x"}

+

{"value":"0:0"}

`, @@ -16,8 +16,8 @@ export default { -

{"value":"x"}

-

{"value":"x"}

+

{"value":"0:0"}

+

{"value":"1:0"}

`); } }; diff --git a/test/runtime/samples/component-binding-blowback-d/main.svelte b/test/runtime/samples/component-binding-blowback-d/main.svelte index 5690b33813..d6e9412618 100644 --- a/test/runtime/samples/component-binding-blowback-d/main.svelte +++ b/test/runtime/samples/component-binding-blowback-d/main.svelte @@ -7,8 +7,8 @@ }; - - + +

{obj.a.map(JSON.stringify)}

{obj.b.map(JSON.stringify)}

\ No newline at end of file diff --git a/test/runtime/samples/component-binding-blowback-e/One.svelte b/test/runtime/samples/component-binding-blowback-e/One.svelte index e2e86b1bf7..f86da72ff2 100644 --- a/test/runtime/samples/component-binding-blowback-e/One.svelte +++ b/test/runtime/samples/component-binding-blowback-e/One.svelte @@ -2,14 +2,15 @@ import Two from './Two.svelte'; export let list; + export let i; function handle_click() { list = [...list, {}]; } -{#each list as item} - +{#each list as item, j} + {/each} -

{"value":{"x":true}}

+

{"value":{"i":0,"j":0}}

`, @@ -16,8 +16,8 @@ export default { -

{"value":{"x":true}}

-

{"value":{"x":true}}

+

{"value":{"i":0,"j":0}}

+

{"value":{"i":1,"j":0}}

`); } }; diff --git a/test/runtime/samples/component-binding-blowback-e/main.svelte b/test/runtime/samples/component-binding-blowback-e/main.svelte index 5690b33813..d6e9412618 100644 --- a/test/runtime/samples/component-binding-blowback-e/main.svelte +++ b/test/runtime/samples/component-binding-blowback-e/main.svelte @@ -7,8 +7,8 @@ }; - - + +

{obj.a.map(JSON.stringify)}

{obj.b.map(JSON.stringify)}

\ No newline at end of file diff --git a/test/runtime/samples/component-binding-blowback-f/One.svelte b/test/runtime/samples/component-binding-blowback-f/One.svelte index e2e86b1bf7..f86da72ff2 100644 --- a/test/runtime/samples/component-binding-blowback-f/One.svelte +++ b/test/runtime/samples/component-binding-blowback-f/One.svelte @@ -2,14 +2,15 @@ import Two from './Two.svelte'; export let list; + export let i; function handle_click() { list = [...list, {}]; } -{#each list as item} - +{#each list as item, j} + {/each} -

{"value":{"x":true}}

+

{"value":{"i":0,"j":0}}

+

+ `, + + ssrHtml: ` + + + +

{}

`, @@ -18,8 +24,8 @@ export default { -

{"value":{"x":true}}

-

{"value":{"x":true}}

+

{"value":{"i":0,"j":0}}

+

{"value":{"i":1,"j":0}}

`); } }; diff --git a/test/runtime/samples/component-binding-blowback-f/main.svelte b/test/runtime/samples/component-binding-blowback-f/main.svelte index 5690b33813..d6e9412618 100644 --- a/test/runtime/samples/component-binding-blowback-f/main.svelte +++ b/test/runtime/samples/component-binding-blowback-f/main.svelte @@ -7,8 +7,8 @@ }; - - + +

{obj.a.map(JSON.stringify)}

{obj.b.map(JSON.stringify)}

\ No newline at end of file