Merge pull request #677 from Demonthos/native-core-list-mutation-bugfix
This commit is contained in:
2 files changed
+23
-22
No files matched your search
@@ -174,7 +174,7 @@ impl<S: State> RealDom<S> {
|
|||||||
use dioxus_core::Mutation::*;
|
use dioxus_core::Mutation::*;
|
||||||
match e {
|
match e {
|
||||||
AppendChildren { id, m } => {
|
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);
|
let parent = self.element_to_node_id(id);
|
||||||
for child in children {
|
for child in children {
|
||||||
self.add_child(parent, child);
|
self.add_child(parent, child);
|
||||||
@@ -222,10 +222,10 @@ impl<S: State> RealDom<S> {
|
|||||||
self.stack.push(clone_id);
|
self.stack.push(clone_id);
|
||||||
}
|
}
|
||||||
ReplaceWith { id, m } => {
|
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);
|
let old_node_id = self.element_to_node_id(id);
|
||||||
for new in new_nodes {
|
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);
|
mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
|
||||||
}
|
}
|
||||||
self.tree.remove(old_node_id);
|
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 new_nodes = self.stack.split_off(self.stack.len() - m);
|
||||||
let old_node_id = self.load_child(path);
|
let old_node_id = self.load_child(path);
|
||||||
for new in new_nodes {
|
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);
|
mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
|
||||||
}
|
}
|
||||||
self.tree.remove(old_node_id);
|
self.tree.remove(old_node_id);
|
||||||
}
|
}
|
||||||
InsertAfter { id, m } => {
|
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);
|
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);
|
self.tree.insert_after(old_node_id, new);
|
||||||
mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
|
mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
InsertBefore { id, m } => {
|
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);
|
let old_node_id = self.element_to_node_id(id);
|
||||||
for new in new_nodes {
|
for new in new_nodes {
|
||||||
self.tree.insert_before(old_node_id, new);
|
self.tree.insert_before(old_node_id, new);
|
||||||
|
|||||||
@@ -73,11 +73,11 @@ impl PersistantElementIter {
|
|||||||
.edits
|
.edits
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|m| {
|
.filter_map(|m| {
|
||||||
// nodes within templates will never be removedns
|
// nodes within templates will never be removed
|
||||||
if let Mutation::Remove { id } = m {
|
match m {
|
||||||
Some(rdom.element_to_node_id(*id))
|
Mutation::Remove { id } => Some(rdom.element_to_node_id(*id)),
|
||||||
} else {
|
Mutation::ReplaceWith { id, .. } => Some(rdom.element_to_node_id(*id)),
|
||||||
None
|
_ => None,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@@ -358,12 +358,16 @@ fn persist_removes() {
|
|||||||
let mut rdom: RealDom<Empty> = RealDom::new();
|
let mut rdom: RealDom<Empty> = RealDom::new();
|
||||||
|
|
||||||
let build = vdom.rebuild();
|
let build = vdom.rebuild();
|
||||||
|
println!("{:#?}", build);
|
||||||
let _to_update = rdom.apply_mutations(build);
|
let _to_update = rdom.apply_mutations(build);
|
||||||
|
|
||||||
// this will end on the node that is removed
|
// this will end on the node that is removed
|
||||||
let mut iter1 = PersistantElementIter::new();
|
let mut iter1 = PersistantElementIter::new();
|
||||||
// this will end on the after node that is removed
|
// this will end on the after node that is removed
|
||||||
let mut iter2 = PersistantElementIter::new();
|
let mut iter2 = PersistantElementIter::new();
|
||||||
|
// root
|
||||||
|
iter1.next(&rdom).id();
|
||||||
|
iter2.next(&rdom).id();
|
||||||
// div
|
// div
|
||||||
iter1.next(&rdom).id();
|
iter1.next(&rdom).id();
|
||||||
iter2.next(&rdom).id();
|
iter2.next(&rdom).id();
|
||||||
@@ -386,27 +390,24 @@ fn persist_removes() {
|
|||||||
|
|
||||||
vdom.mark_dirty(ScopeId(0));
|
vdom.mark_dirty(ScopeId(0));
|
||||||
let update = vdom.render_immediate();
|
let update = vdom.render_immediate();
|
||||||
|
println!("{:#?}", update);
|
||||||
iter1.prune(&update, &rdom);
|
iter1.prune(&update, &rdom);
|
||||||
iter2.prune(&update, &rdom);
|
iter2.prune(&update, &rdom);
|
||||||
let _to_update = rdom.apply_mutations(update);
|
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();
|
let idx = iter1.next(&rdom).id();
|
||||||
|
dbg!(&rdom[idx].node_data.node_type);
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
&rdom[idx].node_data.node_type,
|
&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();
|
let idx = iter2.next(&rdom).id();
|
||||||
|
dbg!(&rdom[idx].node_data.node_type);
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
&rdom[idx].node_data.node_type,
|
&rdom[idx].node_data.node_type,
|
||||||
NodeType::Element { tag: div_tag, .. }
|
NodeType::Element { tag: root_tag, .. }
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user