diff_element.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. use dioxus::core::Mutation::*;
  2. use dioxus::prelude::*;
  3. use dioxus_core::ElementId;
  4. #[test]
  5. fn text_diff() {
  6. fn app(cx: Scope) -> Element {
  7. let gen = cx.generation();
  8. cx.render(rsx!( h1 { "hello {gen}" } ))
  9. }
  10. let mut vdom = VirtualDom::new(app);
  11. vdom.rebuild();
  12. vdom.mark_dirty_scope(ScopeId(0));
  13. assert_eq!(
  14. vdom.render_immediate().edits,
  15. [SetText { value: "hello 1", id: ElementId(2) }]
  16. );
  17. vdom.mark_dirty_scope(ScopeId(0));
  18. assert_eq!(
  19. vdom.render_immediate().edits,
  20. [SetText { value: "hello 2", id: ElementId(2) }]
  21. );
  22. vdom.mark_dirty_scope(ScopeId(0));
  23. assert_eq!(
  24. vdom.render_immediate().edits,
  25. [SetText { value: "hello 3", id: ElementId(2) }]
  26. );
  27. }
  28. #[test]
  29. fn element_swap() {
  30. fn app(cx: Scope) -> Element {
  31. let gen = cx.generation();
  32. match gen % 2 {
  33. 0 => cx.render(rsx!( h1 { "hello 1" } )),
  34. 1 => cx.render(rsx!( h2 { "hello 2" } )),
  35. _ => unreachable!(),
  36. }
  37. }
  38. let mut vdom = VirtualDom::new(app);
  39. vdom.rebuild();
  40. vdom.mark_dirty_scope(ScopeId(0));
  41. dbg!(vdom.render_immediate());
  42. vdom.mark_dirty_scope(ScopeId(0));
  43. dbg!(vdom.render_immediate());
  44. vdom.mark_dirty_scope(ScopeId(0));
  45. dbg!(vdom.render_immediate());
  46. vdom.mark_dirty_scope(ScopeId(0));
  47. dbg!(vdom.render_immediate());
  48. }