change_nodes.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. use dioxus::core as dioxus_core;
  2. use dioxus::core::{ElementId, VElement};
  3. use dioxus::prelude::*;
  4. use dioxus_native_core::real_dom::RealDom;
  5. use dioxus_native_core::state::State;
  6. use dioxus_native_core_macro::State;
  7. use std::cell::Cell;
  8. #[derive(State, Default, Clone)]
  9. struct Empty {}
  10. #[test]
  11. fn remove_node() {
  12. #[allow(non_snake_case)]
  13. fn Base(cx: Scope) -> Element {
  14. render!(div {})
  15. }
  16. let vdom = VirtualDom::new(Base);
  17. let mutations = vdom.create_vnodes(rsx! {
  18. div{
  19. div{}
  20. }
  21. });
  22. let mut dom: RealDom<Empty> = RealDom::new();
  23. let _to_update = dom.apply_mutations(vec![mutations]);
  24. let child_div = VElement {
  25. id: Cell::new(Some(ElementId(2))),
  26. key: None,
  27. tag: "div",
  28. namespace: None,
  29. parent: Cell::new(Some(ElementId(1))),
  30. listeners: &[],
  31. attributes: &[],
  32. children: &[],
  33. };
  34. let child_div_el = VNode::Element(&child_div);
  35. let root_div = VElement {
  36. id: Cell::new(Some(ElementId(1))),
  37. key: None,
  38. tag: "div",
  39. namespace: None,
  40. parent: Cell::new(Some(ElementId(0))),
  41. listeners: &[],
  42. attributes: &[],
  43. children: &[child_div_el],
  44. };
  45. assert_eq!(dom.size(), 2);
  46. assert!(&dom.contains_node(&VNode::Element(&root_div)));
  47. assert_eq!(dom[ElementId(1)].height, 1);
  48. assert_eq!(dom[ElementId(2)].height, 2);
  49. let vdom = VirtualDom::new(Base);
  50. let mutations = vdom.diff_lazynodes(
  51. rsx! {
  52. div{
  53. div{}
  54. }
  55. },
  56. rsx! {
  57. div{}
  58. },
  59. );
  60. dom.apply_mutations(vec![mutations.1]);
  61. let new_root_div = VElement {
  62. id: Cell::new(Some(ElementId(1))),
  63. key: None,
  64. tag: "div",
  65. namespace: None,
  66. parent: Cell::new(Some(ElementId(0))),
  67. listeners: &[],
  68. attributes: &[],
  69. children: &[],
  70. };
  71. assert_eq!(dom.size(), 1);
  72. assert!(&dom.contains_node(&VNode::Element(&new_root_div)));
  73. assert_eq!(dom[ElementId(1)].height, 1);
  74. }
  75. #[test]
  76. fn add_node() {
  77. #[allow(non_snake_case)]
  78. fn Base(cx: Scope) -> Element {
  79. render!(div {})
  80. }
  81. let vdom = VirtualDom::new(Base);
  82. let mutations = vdom.create_vnodes(rsx! {
  83. div{}
  84. });
  85. let mut dom: RealDom<Empty> = RealDom::new();
  86. let _to_update = dom.apply_mutations(vec![mutations]);
  87. let root_div = VElement {
  88. id: Cell::new(Some(ElementId(1))),
  89. key: None,
  90. tag: "div",
  91. namespace: None,
  92. parent: Cell::new(Some(ElementId(0))),
  93. listeners: &[],
  94. attributes: &[],
  95. children: &[],
  96. };
  97. assert_eq!(dom.size(), 1);
  98. assert!(&dom.contains_node(&VNode::Element(&root_div)));
  99. assert_eq!(dom[ElementId(1)].height, 1);
  100. let vdom = VirtualDom::new(Base);
  101. let mutations = vdom.diff_lazynodes(
  102. rsx! {
  103. div{}
  104. },
  105. rsx! {
  106. div{
  107. p{}
  108. }
  109. },
  110. );
  111. dom.apply_mutations(vec![mutations.1]);
  112. let child_div = VElement {
  113. id: Cell::new(Some(ElementId(2))),
  114. key: None,
  115. tag: "p",
  116. namespace: None,
  117. parent: Cell::new(Some(ElementId(1))),
  118. listeners: &[],
  119. attributes: &[],
  120. children: &[],
  121. };
  122. let child_div_el = VNode::Element(&child_div);
  123. let new_root_div = VElement {
  124. id: Cell::new(Some(ElementId(1))),
  125. key: None,
  126. tag: "div",
  127. namespace: None,
  128. parent: Cell::new(Some(ElementId(0))),
  129. listeners: &[],
  130. attributes: &[],
  131. children: &[child_div_el],
  132. };
  133. assert_eq!(dom.size(), 2);
  134. assert!(&dom.contains_node(&VNode::Element(&new_root_div)));
  135. assert_eq!(dom[ElementId(1)].height, 1);
  136. assert_eq!(dom[ElementId(2)].height, 2);
  137. }