From 3a6d06e20554bbc98865c61875dd4a902e498f1c Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 5 Jan 2023 08:21:36 -0600 Subject: [PATCH] remove nodes from listener list when the node is removed --- packages/native-core/src/real_dom.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/native-core/src/real_dom.rs b/packages/native-core/src/real_dom.rs index 08feb6acb..2c0368198 100644 --- a/packages/native-core/src/real_dom.rs +++ b/packages/native-core/src/real_dom.rs @@ -227,7 +227,7 @@ impl, V: FromAnyValue> RealDom { self.tree.insert_before(old_node_id, new); mark_dirty(new, NodeMask::ALL, &mut nodes_updated); } - self.tree.remove(old_node_id); + self.remove(old_node_id, &mut nodes_updated); } ReplacePlaceholder { path, m } => { let new_nodes = self.stack.split_off(self.stack.len() - m); @@ -236,7 +236,7 @@ impl, V: FromAnyValue> RealDom { self.tree.insert_before(old_node_id, new); mark_dirty(new, NodeMask::ALL, &mut nodes_updated); } - self.tree.remove(old_node_id); + self.remove(old_node_id, &mut nodes_updated); } InsertAfter { id, m } => { let new_nodes = self.stack.split_off(self.stack.len() - m); @@ -326,7 +326,7 @@ impl, V: FromAnyValue> RealDom { } Remove { id } => { let node_id = self.element_to_node_id(id); - self.tree.remove(node_id); + self.remove(node_id, &mut nodes_updated); } PushRoot { id } => { let node_id = self.element_to_node_id(id); @@ -406,6 +406,23 @@ impl, V: FromAnyValue> RealDom { } new_id } + + fn remove(&mut self, node_id: NodeId, nodes_updated: &mut FxHashMap) { + let node = self.tree.get(node_id).unwrap(); + if let NodeType::Element { listeners, .. } = &node.node_data.node_type { + for name in listeners.iter() { + self.nodes_listening.get_mut(name).unwrap().remove(&node_id); + } + } + if let Some(children) = self.tree.children_ids(node_id) { + let children = children.to_vec(); + for child in children { + self.remove(child, nodes_updated); + } + } + self.tree.remove(node_id); + mark_dirty(node_id, NodeMask::ALL, nodes_updated); + } } impl + Sync, V: FromAnyValue> RealDom