sharedstate.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #![allow(unused, non_upper_case_globals, non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_core::{DomEdit, Mutations, SchedulerMsg, ScopeId};
  4. use std::rc::Rc;
  5. use DomEdit::*;
  6. mod test_logging;
  7. #[test]
  8. fn shared_state_test() {
  9. struct MySharedState(&'static str);
  10. static App: Component = |cx| {
  11. cx.provide_context(Rc::new(MySharedState("world!")));
  12. cx.render(rsx!(Child {}))
  13. };
  14. static Child: Component = |cx| {
  15. let shared = cx.consume_context::<Rc<MySharedState>>()?;
  16. cx.render(rsx!("Hello, {shared.0}"))
  17. };
  18. let mut dom = VirtualDom::new(App);
  19. let Mutations { edits, .. } = dom.rebuild();
  20. assert_eq!(
  21. edits,
  22. [
  23. CreateTextNode { root: 1, text: "Hello, world!" },
  24. AppendChildren { many: 1 },
  25. ]
  26. );
  27. }
  28. #[test]
  29. fn swap_test() {
  30. struct MySharedState(&'static str);
  31. fn app(cx: Scope) -> Element {
  32. let val = cx.use_hook(|_| 0);
  33. *val += 1;
  34. cx.provide_context(Rc::new(MySharedState("world!")));
  35. let child = match *val % 2 {
  36. 0 => rsx!(
  37. Child1 {
  38. Child1 { }
  39. Child2 { }
  40. }
  41. ),
  42. _ => rsx!(
  43. Child2 {
  44. Child2 { }
  45. Child2 { }
  46. }
  47. ),
  48. };
  49. cx.render(rsx!(
  50. Router {
  51. div { child }
  52. }
  53. ))
  54. }
  55. #[inline_props]
  56. fn Router<'a>(cx: Scope, children: Element<'a>) -> Element<'a> {
  57. cx.render(rsx!(div { children }))
  58. }
  59. #[inline_props]
  60. fn Child1<'a>(cx: Scope, children: Element<'a>) -> Element {
  61. let shared = cx.consume_context::<Rc<MySharedState>>().unwrap();
  62. println!("Child1: {}", shared.0);
  63. cx.render(rsx! {
  64. div {
  65. "{shared.0}",
  66. children
  67. }
  68. })
  69. }
  70. #[inline_props]
  71. fn Child2<'a>(cx: Scope, children: Element<'a>) -> Element {
  72. let shared = cx.consume_context::<Rc<MySharedState>>().unwrap();
  73. println!("Child2: {}", shared.0);
  74. cx.render(rsx! {
  75. h1 {
  76. "{shared.0}",
  77. children
  78. }
  79. })
  80. }
  81. let mut dom = VirtualDom::new(app);
  82. let Mutations { edits, .. } = dom.rebuild();
  83. dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  84. dom.work_with_deadline(|| false);
  85. dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  86. dom.work_with_deadline(|| false);
  87. dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  88. dom.work_with_deadline(|| false);
  89. dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  90. dom.work_with_deadline(|| false);
  91. dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  92. dom.work_with_deadline(|| false);
  93. dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  94. dom.work_with_deadline(|| false);
  95. // dom.handle_message(SchedulerMsg::Immediate(ScopeId(1)));
  96. // dom.work_with_deadline(|| false);
  97. // dom.handle_message(SchedulerMsg::Immediate(ScopeId(2)));
  98. // dom.work_with_deadline(|| false);
  99. // dom.handle_message(SchedulerMsg::Immediate(ScopeId(3)));
  100. // dom.work_with_deadline(|| false);
  101. // dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  102. // dom.work_with_deadline(|| false);
  103. // dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  104. // dom.work_with_deadline(|| false);
  105. // dom.handle_message(SchedulerMsg::Immediate(ScopeId(0)));
  106. // dom.work_with_deadline(|| false);
  107. }