فهرست منبع

Merge pull request #677 from Demonthos/native-core-list-mutation-bugfix

Jon Kelley 2 سال پیش
والد
کامیت
6924dddb92
2فایلهای تغییر یافته به همراه23 افزوده شده و 22 حذف شده
  1. 7 7
      packages/native-core/src/real_dom.rs
  2. 16 15
      packages/native-core/src/utils/persistant_iterator.rs

+ 7 - 7
packages/native-core/src/real_dom.rs

@@ -174,7 +174,7 @@ impl<S: State> RealDom<S> {
             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<S: State> RealDom<S> {
                     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<S: State> RealDom<S> {
                     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);

+ 16 - 15
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<Empty> = 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, .. }
     ));
 }