fix: keyed diffing accidentally pushing every node

This commit is contained in:
Jonathan Kelley 2022-02-23 08:09:16 -05:00
parent 6b17522507
commit 92573d67a1
2 changed files with 7 additions and 18 deletions

View file

@ -853,7 +853,7 @@ impl<'b> DiffState<'b> {
nodes_created += self.create_node(new_node);
} else {
self.diff_node(&old[old_index], new_node);
nodes_created += self.push_all_nodes(new_node);
nodes_created += self.push_all_real_nodes(new_node);
}
}
@ -876,7 +876,7 @@ impl<'b> DiffState<'b> {
nodes_created += self.create_node(new_node);
} else {
self.diff_node(&old[old_index], new_node);
nodes_created += self.push_all_nodes(new_node);
nodes_created += self.push_all_real_nodes(new_node);
}
}
@ -899,7 +899,7 @@ impl<'b> DiffState<'b> {
nodes_created += self.create_node(new_node);
} else {
self.diff_node(&old[old_index], new_node);
nodes_created += self.push_all_nodes(new_node);
nodes_created += self.push_all_real_nodes(new_node);
}
}
@ -1100,9 +1100,9 @@ impl<'b> DiffState<'b> {
}
// recursively push all the nodes of a tree onto the stack and return how many are there
fn push_all_nodes(&mut self, node: &'b VNode<'b>) -> usize {
fn push_all_real_nodes(&mut self, node: &'b VNode<'b>) -> usize {
match node {
VNode::Text(_) | VNode::Placeholder(_) => {
VNode::Text(_) | VNode::Placeholder(_) | VNode::Element(_) => {
self.mutations.push_root(node.mounted_id());
1
}
@ -1110,7 +1110,7 @@ impl<'b> DiffState<'b> {
VNode::Fragment(frag) => {
let mut added = 0;
for child in frag.children {
added += self.push_all_nodes(child);
added += self.push_all_real_nodes(child);
}
added
}
@ -1118,16 +1118,7 @@ impl<'b> DiffState<'b> {
VNode::Component(c) => {
let scope_id = c.scope.get().unwrap();
let root = self.scopes.root_node(scope_id);
self.push_all_nodes(root)
}
VNode::Element(el) => {
let mut num_on_stack = 0;
for child in el.children.iter() {
num_on_stack += self.push_all_nodes(child);
}
self.mutations.push_root(el.id.get().unwrap());
num_on_stack + 1
self.push_all_real_nodes(root)
}
}
}

View file

@ -53,14 +53,12 @@ export class Interpreter {
}
}
CreateTextNode(text, root) {
// todo: make it so the types are okay
const node = document.createTextNode(text);
this.nodes[root] = node;
this.stack.push(node);
}
CreateElement(tag, root) {
const el = document.createElement(tag);
// el.setAttribute("data-dioxus-id", `${root}`);
this.nodes[root] = el;
this.stack.push(el);
}