From 7eac90065ac292eb9014e109962fedc8fe4ea566 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 24 Dec 2022 10:58:56 -0600 Subject: [PATCH 1/2] fix mutations related to keyed lists --- packages/native-core/src/real_dom.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/native-core/src/real_dom.rs b/packages/native-core/src/real_dom.rs index 621e16577..00b9afb03 100644 --- a/packages/native-core/src/real_dom.rs +++ b/packages/native-core/src/real_dom.rs @@ -174,7 +174,7 @@ impl RealDom { use dioxus_core::Mutation::*; match e { AppendChildren { id, m } => { - let children = self.stack.split_off(m); + let children = self.stack.split_off(self.stack.len() - m); let parent = self.element_to_node_id(id); for child in children { self.add_child(parent, child); @@ -222,10 +222,10 @@ impl RealDom { self.stack.push(clone_id); } ReplaceWith { id, m } => { - let new_nodes = self.stack.split_off(m); + let new_nodes = self.stack.split_off(self.stack.len() - m); let old_node_id = self.element_to_node_id(id); for new in new_nodes { - self.tree.insert_after(old_node_id, new); + self.tree.insert_before(old_node_id, new); mark_dirty(new, NodeMask::ALL, &mut nodes_updated); } self.tree.remove(old_node_id); @@ -234,21 +234,21 @@ impl RealDom { let new_nodes = self.stack.split_off(self.stack.len() - m); let old_node_id = self.load_child(path); for new in new_nodes { - self.tree.insert_after(old_node_id, new); + self.tree.insert_before(old_node_id, new); mark_dirty(new, NodeMask::ALL, &mut nodes_updated); } self.tree.remove(old_node_id); } InsertAfter { id, m } => { - let new_nodes = self.stack.split_off(m); + let new_nodes = self.stack.split_off(self.stack.len() - m); let old_node_id = self.element_to_node_id(id); - for new in new_nodes { + for new in new_nodes.into_iter().rev() { self.tree.insert_after(old_node_id, new); mark_dirty(new, NodeMask::ALL, &mut nodes_updated); } } InsertBefore { id, m } => { - let new_nodes = self.stack.split_off(m); + let new_nodes = self.stack.split_off(self.stack.len() - m); let old_node_id = self.element_to_node_id(id); for new in new_nodes { self.tree.insert_before(old_node_id, new); From c0d138fc1bcec94d8e81476bb3dd84a6eb785c82 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 24 Dec 2022 11:37:17 -0600 Subject: [PATCH 2/2] fix persistant iterator test --- .../src/utils/persistant_iterator.rs | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/native-core/src/utils/persistant_iterator.rs b/packages/native-core/src/utils/persistant_iterator.rs index 3ffe45916..75bcf9064 100644 --- a/packages/native-core/src/utils/persistant_iterator.rs +++ b/packages/native-core/src/utils/persistant_iterator.rs @@ -73,11 +73,11 @@ impl PersistantElementIter { .edits .iter() .filter_map(|m| { - // nodes within templates will never be removedns - if let Mutation::Remove { id } = m { - Some(rdom.element_to_node_id(*id)) - } else { - None + // nodes within templates will never be removed + match m { + Mutation::Remove { id } => Some(rdom.element_to_node_id(*id)), + Mutation::ReplaceWith { id, .. } => Some(rdom.element_to_node_id(*id)), + _ => None, } }) .collect(); @@ -358,12 +358,16 @@ fn persist_removes() { let mut rdom: RealDom = RealDom::new(); let build = vdom.rebuild(); + println!("{:#?}", build); let _to_update = rdom.apply_mutations(build); // this will end on the node that is removed let mut iter1 = PersistantElementIter::new(); // this will end on the after node that is removed let mut iter2 = PersistantElementIter::new(); + // root + iter1.next(&rdom).id(); + iter2.next(&rdom).id(); // div iter1.next(&rdom).id(); iter2.next(&rdom).id(); @@ -386,27 +390,24 @@ fn persist_removes() { vdom.mark_dirty(ScopeId(0)); let update = vdom.render_immediate(); + println!("{:#?}", update); iter1.prune(&update, &rdom); iter2.prune(&update, &rdom); let _to_update = rdom.apply_mutations(update); - let p_tag = "1".to_string(); + let root_tag = "Root".to_string(); let idx = iter1.next(&rdom).id(); + dbg!(&rdom[idx].node_data.node_type); assert!(matches!( &rdom[idx].node_data.node_type, - NodeType::Element { tag: p_tag, .. } + NodeType::Element { tag: root_tag, .. } )); - let text = "2".to_string(); - let idx = iter1.next(&rdom).id(); - assert!(matches!( - &rdom[idx].node_data.node_type, - NodeType::Text { text, .. } - )); - let div_tag = "div".to_string(); + let idx = iter2.next(&rdom).id(); + dbg!(&rdom[idx].node_data.node_type); assert!(matches!( &rdom[idx].node_data.node_type, - NodeType::Element { tag: div_tag, .. } + NodeType::Element { tag: root_tag, .. } )); }