瀏覽代碼

Merge pull request #287 from DioxusLabs/jk/diff-keyed-fix

Jonathan Kelley 3 年之前
父節點
當前提交
0350d25a33
共有 2 個文件被更改,包括 14 次插入3 次删除
  1. 9 0
      packages/core/src/diff.rs
  2. 5 3
      packages/core/tests/diffing.rs

+ 9 - 0
packages/core/src/diff.rs

@@ -813,6 +813,15 @@ impl<'b> DiffState<'b> {
             return;
         }
 
+        // remove any old children that are not shared
+        // todo: make this an iterator
+        for child in old {
+            let key = child.key().unwrap();
+            if !shared_keys.contains(&key) {
+                self.remove_nodes([child], true);
+            }
+        }
+
         // 4. Compute the LIS of this list
         let mut lis_sequence = Vec::default();
         lis_sequence.reserve(new_index_to_old_index.len());

+ 5 - 3
packages/core/tests/diffing.rs

@@ -623,16 +623,17 @@ fn controlled_keyed_diffing_out_of_order() {
     assert_eq!(
         changes.edits,
         [
+            Remove { root: 4 },
             // move 4 to after 6
             PushRoot { root: 1 },
             InsertAfter { n: 1, root: 3 },
             // remove 7
 
             // create 9 and insert before 6
-            CreateElement { root: 5, tag: "div" },
+            CreateElement { root: 4, tag: "div" },
             InsertBefore { n: 1, root: 3 },
             // create 0 and insert before 5
-            CreateElement { root: 6, tag: "div" },
+            CreateElement { root: 5, tag: "div" },
             InsertBefore { n: 1, root: 2 },
         ]
     );
@@ -659,7 +660,8 @@ fn controlled_keyed_diffing_out_of_order_max_test() {
     assert_eq!(
         changes.edits,
         [
-            CreateElement { root: 6, tag: "div" },
+            Remove { root: 5 },
+            CreateElement { root: 5, tag: "div" },
             InsertBefore { n: 1, root: 3 },
             PushRoot { root: 4 },
             InsertBefore { n: 1, root: 1 },