1
0

split_subscriptions.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_signals::Signal;
  4. fn main() {
  5. dioxus_desktop::launch(app);
  6. }
  7. #[derive(Clone, Copy, Default)]
  8. struct ApplicationData {
  9. first_data: Signal<i32>,
  10. second_data: Signal<i32>,
  11. many_signals: Signal<Vec<Signal<i32>>>,
  12. }
  13. fn use_app_data(cx: Scope) -> ApplicationData {
  14. *use_context(cx).unwrap()
  15. }
  16. fn app(cx: Scope) -> Element {
  17. use_context_provider(cx, ApplicationData::default);
  18. render! {
  19. div {
  20. ReadsFirst {}
  21. }
  22. div {
  23. ReadsSecond {}
  24. }
  25. div {
  26. ReadsManySignals {}
  27. }
  28. }
  29. }
  30. fn ReadsFirst(cx: Scope) -> Element {
  31. println!("running first");
  32. let data = use_app_data(cx);
  33. render! {
  34. button {
  35. onclick: move |_| {
  36. *data.first_data.write() += 1;
  37. },
  38. "Increase"
  39. }
  40. button {
  41. onclick: move |_| {
  42. *data.first_data.write() -= 1;
  43. },
  44. "Decrease"
  45. }
  46. button {
  47. onclick: move |_| {
  48. *data.first_data.write() = 0;
  49. },
  50. "Reset"
  51. }
  52. "{data.first_data}"
  53. }
  54. }
  55. fn ReadsSecond(cx: Scope) -> Element {
  56. println!("running second");
  57. let data = use_app_data(cx);
  58. render! {
  59. button {
  60. onclick: move |_| {
  61. *data.second_data.write() += 1;
  62. },
  63. "Increase"
  64. }
  65. button {
  66. onclick: move |_| {
  67. *data.second_data.write() -= 1;
  68. },
  69. "Decrease"
  70. }
  71. button {
  72. onclick: move |_| {
  73. *data.second_data.write() = 0;
  74. },
  75. "Reset"
  76. }
  77. "{data.second_data}"
  78. }
  79. }
  80. fn ReadsManySignals(cx: Scope) -> Element {
  81. println!("running many signals");
  82. let data = use_app_data(cx);
  83. render! {
  84. button {
  85. onclick: move |_| {
  86. data.many_signals.write().push(Signal::new(0));
  87. },
  88. "Create"
  89. }
  90. button {
  91. onclick: move |_| {
  92. data.many_signals.write().pop();
  93. },
  94. "Destroy"
  95. }
  96. button {
  97. onclick: move |_| {
  98. if let Some(first) = data.many_signals.read().get(0) {
  99. *first.write() += 1;
  100. }
  101. },
  102. "Increase First Item"
  103. }
  104. for signal in data.many_signals {
  105. Child {
  106. count: signal,
  107. }
  108. }
  109. }
  110. }
  111. #[derive(Props, PartialEq)]
  112. struct ChildProps {
  113. count: Signal<i32>,
  114. }
  115. fn Child(cx: Scope<ChildProps>) -> Element {
  116. println!("running child");
  117. let count = cx.props.count;
  118. render! {
  119. div {
  120. "Child: {count}"
  121. button {
  122. onclick: move |_| {
  123. *count.write() += 1;
  124. },
  125. "Increase"
  126. }
  127. button {
  128. onclick: move |_| {
  129. *count.write() -= 1;
  130. },
  131. "Decrease"
  132. }
  133. }
  134. }
  135. }