From f3ddb3a83dda8cdf582fc50f17d5c71e9b1eaa37 Mon Sep 17 00:00:00 2001 From: Nguyen Tran Date: Mon, 29 May 2023 23:27:14 -0400 Subject: [PATCH] Add dirty dependency check for each value iterable --- .../compile/render_dom/wrappers/EachBlock.js | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/compiler/compile/render_dom/wrappers/EachBlock.js b/packages/svelte/src/compiler/compile/render_dom/wrappers/EachBlock.js index 7e1d139362..a432cca3e9 100644 --- a/packages/svelte/src/compiler/compile/render_dom/wrappers/EachBlock.js +++ b/packages/svelte/src/compiler/compile/render_dom/wrappers/EachBlock.js @@ -475,8 +475,19 @@ export default class EachBlockWrapper extends Wrapper { : '@destroy_block'; if (this.dependencies.size) { this.block.maintain_context = true; + + let update_each_block_value = b`${this.vars.each_block_value} = ${snippet};`; + if (this.node.expression.dependencies.size == 0) { + update_each_block_value = null; + } else if (this.dependencies.size > this.node.expression.dependencies.size) { + const snippet_dependencies = Array.from(this.node.expression.dependencies); + update_each_block_value = b`if (${block.renderer.dirty(snippet_dependencies)}) { + ${update_each_block_value} + }`; + } + this.updates.push(b` - ${this.vars.each_block_value} = ${snippet}; + ${update_each_block_value} ${this.block.has_outros && b`@group_outros();`} ${ @@ -619,12 +630,22 @@ export default class EachBlockWrapper extends Wrapper { ${!fixed_length && b`${view_length} = ${data_length};`} `; } + + let update_each_block_value = b`${this.vars.each_block_value} = ${snippet};`; + if (this.node.expression.dependencies.size == 0) { + update_each_block_value = null; + } else if (this.dependencies.size > this.node.expression.dependencies.size) { + const snippet_dependencies = Array.from(this.node.expression.dependencies); + update_each_block_value = b`if (${block.renderer.dirty(snippet_dependencies)}) { + ${update_each_block_value} + }`; + } + // We declare `i` as block scoped here, as the `remove_old_blocks` code // may rely on continuing where this iteration stopped. const update = b` ${!this.block.has_update_method && b`const #old_length = ${this.vars.each_block_value}.length;`} - ${this.vars.each_block_value} = ${snippet}; - + ${update_each_block_value} let #i; for (#i = ${start}; #i < ${data_length}; #i += 1) { const child_ctx = ${this.vars.get_each_context}(#ctx, ${this.vars.each_block_value}, #i);