From b53ba7b5c7f925977f51b9dd92a6a54808b03a5a Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Fri, 19 Jan 2024 19:23:01 -0600 Subject: [PATCH] fix replacing fragments --- packages/core/src/diff/iterator.rs | 4 ++-- packages/core/src/diff/node.rs | 7 +++++-- packages/core/tests/diff_keyed_list.rs | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/core/src/diff/iterator.rs b/packages/core/src/diff/iterator.rs index fefab3c93..f40fbad8c 100644 --- a/packages/core/src/diff/iterator.rs +++ b/packages/core/src/diff/iterator.rs @@ -284,8 +284,8 @@ impl VirtualDom { // create the new children afresh. if shared_keys.is_empty() { if !old.is_empty() { - self.remove_nodes(to, &old[1..], None); - old[0].replace(new, parent, self, to); + let m = self.create_children(to, new, parent); + self.remove_nodes(to, old, Some(m)); } else { // I think this is wrong - why are we appending? // only valid of the if there are no trailing elements diff --git a/packages/core/src/diff/node.rs b/packages/core/src/diff/node.rs index 58d77dde5..934fc5517 100644 --- a/packages/core/src/diff/node.rs +++ b/packages/core/src/diff/node.rs @@ -297,8 +297,11 @@ impl VNode { dom.reclaim(id) } Fragment(nodes) => { - for node in nodes { - node.remove_node(dom, to, replace_with, gen_muts) + for node in &nodes[..nodes.len() - 1] { + node.remove_node(dom, to, None, gen_muts) + } + if let Some(last_node) = nodes.last() { + last_node.remove_node(dom, to, replace_with, gen_muts) } } }; diff --git a/packages/core/tests/diff_keyed_list.rs b/packages/core/tests/diff_keyed_list.rs index 7d7ae9f5e..659388ee4 100644 --- a/packages/core/tests/diff_keyed_list.rs +++ b/packages/core/tests/diff_keyed_list.rs @@ -347,11 +347,11 @@ fn no_common_keys() { assert_eq!( dom.render_immediate_to_vec().santize().edits, [ + LoadTemplate { name: "template", index: 0, id: ElementId(4) }, + LoadTemplate { name: "template", index: 0, id: ElementId(5) }, + LoadTemplate { name: "template", index: 0, id: ElementId(6) }, Remove { id: ElementId(3) }, Remove { id: ElementId(2) }, - LoadTemplate { name: "template", index: 0, id: ElementId(2) }, - LoadTemplate { name: "template", index: 0, id: ElementId(3) }, - LoadTemplate { name: "template", index: 0, id: ElementId(4) }, ReplaceWith { id: ElementId(1), m: 3 } ] );