diff_component.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. use 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 render_phase = cx.use_hook(|| 0);
  11. *render_phase += 1;
  12. match *render_phase {
  13. 0 => render! {
  14. nav_bar {}
  15. dash_board {}
  16. },
  17. 1 => render! {
  18. nav_bar {}
  19. dash_results {}
  20. },
  21. 2 => render! {
  22. nav_bar {}
  23. dash_board {}
  24. },
  25. 3 => render! {
  26. nav_bar {}
  27. dash_results {}
  28. },
  29. 4 => render! {
  30. nav_bar {}
  31. dash_board {}
  32. },
  33. _ => render!("blah"),
  34. }
  35. }
  36. fn nav_bar(cx: Scope) -> Element {
  37. render! {
  38. h1 { "NavBar", (0..3).map(|_| render!(nav_link {})) }
  39. }
  40. }
  41. fn nav_link(cx: Scope) -> Element {
  42. render!( h1 { "nav_link" } )
  43. }
  44. fn dash_board(cx: Scope) -> Element {
  45. render!( div { "dashboard" } )
  46. }
  47. fn dash_results(cx: Scope) -> Element {
  48. render!( div { "results" } )
  49. }
  50. let mut dom = VirtualDom::new(app);
  51. {
  52. let edits = dom.rebuild_to_vec().santize();
  53. assert_eq!(
  54. edits.edits,
  55. [
  56. LoadTemplate { name: "template", index: 0, id: ElementId(1) },
  57. LoadTemplate { name: "template", index: 0, id: ElementId(2) },
  58. LoadTemplate { name: "template", index: 0, id: ElementId(3) },
  59. LoadTemplate { name: "template", index: 0, id: ElementId(4) },
  60. ReplacePlaceholder { path: &[1], m: 3 },
  61. LoadTemplate { name: "template", index: 0, id: ElementId(5) },
  62. AppendChildren { m: 2, id: ElementId(0) }
  63. ]
  64. );
  65. }
  66. dom.mark_dirty(ScopeId::ROOT);
  67. assert_eq!(
  68. dom.render_immediate_to_vec().santize().edits,
  69. [
  70. LoadTemplate { name: "template", index: 0, id: ElementId(6) },
  71. ReplaceWith { id: ElementId(5), m: 1 }
  72. ]
  73. );
  74. dom.mark_dirty(ScopeId::ROOT);
  75. assert_eq!(
  76. dom.render_immediate_to_vec().santize().edits,
  77. [
  78. LoadTemplate { name: "template", index: 0, id: ElementId(5) },
  79. ReplaceWith { id: ElementId(6), m: 1 }
  80. ]
  81. );
  82. dom.mark_dirty(ScopeId::ROOT);
  83. assert_eq!(
  84. dom.render_immediate_to_vec().santize().edits,
  85. [
  86. LoadTemplate { name: "template", index: 0, id: ElementId(6) },
  87. ReplaceWith { id: ElementId(5), m: 1 }
  88. ]
  89. );
  90. }