diff_component.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. use dioxus::dioxus_core::{ElementId, Mutation::*};
  2. use dioxus::prelude::*;
  3. /// When returning sets of components, we do a light diff of the contents to preserve some react-like functionality
  4. ///
  5. /// This means that nav_bar should never get re-created and that we should only be swapping out
  6. /// different pointers
  7. #[test]
  8. fn component_swap() {
  9. fn app() -> Element {
  10. let mut render_phase = use_signal(|| 0);
  11. render_phase += 1;
  12. match render_phase() {
  13. 0 => rsx! {
  14. nav_bar {}
  15. dash_board {}
  16. },
  17. 1 => rsx! {
  18. nav_bar {}
  19. dash_results {}
  20. },
  21. 2 => rsx! {
  22. nav_bar {}
  23. dash_board {}
  24. },
  25. 3 => rsx! {
  26. nav_bar {}
  27. dash_results {}
  28. },
  29. 4 => rsx! {
  30. nav_bar {}
  31. dash_board {}
  32. },
  33. _ => rsx!("blah"),
  34. }
  35. }
  36. fn nav_bar() -> Element {
  37. rsx! {
  38. h1 {
  39. "NavBar"
  40. for _ in 0..3 {
  41. nav_link {}
  42. }
  43. }
  44. }
  45. }
  46. fn nav_link() -> Element {
  47. rsx!( h1 { "nav_link" } )
  48. }
  49. fn dash_board() -> Element {
  50. rsx!( div { "dashboard" } )
  51. }
  52. fn dash_results() -> Element {
  53. rsx!( div { "results" } )
  54. }
  55. let mut dom = VirtualDom::new(app);
  56. {
  57. let edits = dom.rebuild_to_vec().sanitize();
  58. assert_eq!(
  59. edits.edits,
  60. [
  61. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  62. LoadTemplate { name: "template", index: 0, id: ElementId(2) },
  63. LoadTemplate { name: "template", index: 0, id: ElementId(3) },
  64. LoadTemplate { name: "template", index: 0, id: ElementId(4) },
  65. ReplacePlaceholder { path: &[1], m: 3 },
  66. LoadTemplate { name: "template", index: 0, id: ElementId(5) },
  67. AppendChildren { m: 2, id: ElementId(0) }
  68. ]
  69. );
  70. }
  71. dom.mark_dirty(ScopeId::APP);
  72. assert_eq!(
  73. dom.render_immediate_to_vec().sanitize().edits,
  74. [
  75. LoadTemplate { name: "template", index: 0, id: ElementId(6) },
  76. ReplaceWith { id: ElementId(5), m: 1 }
  77. ]
  78. );
  79. dom.mark_dirty(ScopeId::APP);
  80. assert_eq!(
  81. dom.render_immediate_to_vec().sanitize().edits,
  82. [
  83. LoadTemplate { name: "template", index: 0, id: ElementId(5) },
  84. ReplaceWith { id: ElementId(6), m: 1 }
  85. ]
  86. );
  87. dom.mark_dirty(ScopeId::APP);
  88. assert_eq!(
  89. dom.render_immediate_to_vec().sanitize().edits,
  90. [
  91. LoadTemplate { name: "template", index: 0, id: ElementId(6) },
  92. ReplaceWith { id: ElementId(5), m: 1 }
  93. ]
  94. );
  95. }