sharedstate.rs 3.6 KB

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