From 80b09b51231d5b1601f6c691ee6507d4512b1277 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 27 Oct 2022 17:00:06 +0200 Subject: [PATCH] (fix) don't run binding init unnecessarily Fixes part of #7032 Fixes #6298 --- .../wrappers/InlineComponent/index.ts | 2 +- src/runtime/internal/Component.ts | 6 ++++-- .../Tab.svelte | 3 +++ .../_config.js | 7 +++++++ .../main.svelte | 17 +++++++++++++++++ 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 test/runtime/samples/binding-no-unnecessary-invalidation/Tab.svelte create mode 100644 test/runtime/samples/binding-no-unnecessary-invalidation/_config.js create mode 100644 test/runtime/samples/binding-no-unnecessary-invalidation/main.svelte diff --git a/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts b/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts index bca01fdb4cd..f7875dc1b07 100644 --- a/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts +++ b/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts @@ -393,7 +393,7 @@ export default class InlineComponentWrapper extends Wrapper { component.partly_hoisted.push(body); - return b`@binding_callbacks.push(() => @bind(${this.var}, '${binding.name}', ${id}));`; + return b`@binding_callbacks.push(() => @bind(${this.var}, '${binding.name}', ${id}, ${snippet}));`; }); const munged_handlers = this.node.handlers.map(handler => { diff --git a/src/runtime/internal/Component.ts b/src/runtime/internal/Component.ts index 5aec24c651f..eedf8dd1ada 100644 --- a/src/runtime/internal/Component.ts +++ b/src/runtime/internal/Component.ts @@ -5,11 +5,13 @@ import { children, detach, start_hydrating, end_hydrating } from './dom'; import { transition_in } from './transitions'; import { T$$ } from './types'; -export function bind(component, name, callback) { +export function bind(component, name, callback, value) { const index = component.$$.props[name]; if (index !== undefined) { component.$$.bound[index] = callback; - callback(component.$$.ctx[index]); + if (value === undefined) { + callback(component.$$.ctx[index]); + } } } diff --git a/test/runtime/samples/binding-no-unnecessary-invalidation/Tab.svelte b/test/runtime/samples/binding-no-unnecessary-invalidation/Tab.svelte new file mode 100644 index 00000000000..86e2413898a --- /dev/null +++ b/test/runtime/samples/binding-no-unnecessary-invalidation/Tab.svelte @@ -0,0 +1,3 @@ + diff --git a/test/runtime/samples/binding-no-unnecessary-invalidation/_config.js b/test/runtime/samples/binding-no-unnecessary-invalidation/_config.js new file mode 100644 index 00000000000..a34cf0121f4 --- /dev/null +++ b/test/runtime/samples/binding-no-unnecessary-invalidation/_config.js @@ -0,0 +1,7 @@ +export default { + async test({ assert, target }) { + assert.htmlEqual(target.innerHTML, ` +

0

+ `); + } +}; diff --git a/test/runtime/samples/binding-no-unnecessary-invalidation/main.svelte b/test/runtime/samples/binding-no-unnecessary-invalidation/main.svelte new file mode 100644 index 00000000000..c57781cc977 --- /dev/null +++ b/test/runtime/samples/binding-no-unnecessary-invalidation/main.svelte @@ -0,0 +1,17 @@ + + + +

{i}