context_api.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use dioxus::core::{ElementId, Mutation::*};
  2. use dioxus::prelude::*;
  3. #[test]
  4. fn state_shares() {
  5. fn app(cx: Scope) -> Element {
  6. cx.provide_context(cx.generation() as i32);
  7. cx.render(rsx!(child_1 {}))
  8. }
  9. fn child_1(cx: Scope) -> Element {
  10. cx.render(rsx!(child_2 {}))
  11. }
  12. fn child_2(cx: Scope) -> Element {
  13. let value = cx.consume_context::<i32>().unwrap();
  14. cx.render(rsx!("Value is {value}"))
  15. }
  16. let mut dom = VirtualDom::new(app);
  17. assert_eq!(
  18. dom.rebuild().santize().edits,
  19. [
  20. CreateTextNode { value: "Value is 0", id: ElementId(1,) },
  21. AppendChildren { m: 1, id: ElementId(0) },
  22. ]
  23. );
  24. dom.mark_dirty(ScopeId(0));
  25. _ = dom.render_immediate();
  26. assert_eq!(dom.base_scope().consume_context::<i32>().unwrap(), &1);
  27. dom.mark_dirty(ScopeId(0));
  28. _ = dom.render_immediate();
  29. assert_eq!(dom.base_scope().consume_context::<i32>().unwrap(), &2);
  30. dom.mark_dirty(ScopeId(2));
  31. assert_eq!(
  32. dom.render_immediate().santize().edits,
  33. [SetText { value: "Value is 2", id: ElementId(1,) },]
  34. );
  35. dom.mark_dirty(ScopeId(0));
  36. dom.mark_dirty(ScopeId(2));
  37. let edits = dom.render_immediate();
  38. assert_eq!(
  39. edits.santize().edits,
  40. [SetText { value: "Value is 3", id: ElementId(1,) },]
  41. );
  42. }