1
0

split_subscriptions.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_signals::Signal;
  4. fn main() {
  5. 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 app() -> Element {
  14. use_context_provider(ApplicationData::default);
  15. rsx! {
  16. div { ReadsFirst {} }
  17. div { ReadsSecond {} }
  18. div { ReadsManySignals {} }
  19. }
  20. }
  21. #[component]
  22. fn ReadsFirst() -> Element {
  23. println!("running first");
  24. let mut data = use_context::<ApplicationData>();
  25. rsx! {
  26. button {
  27. onclick: move |_| {
  28. *data.first_data.write() += 1;
  29. },
  30. "Increase"
  31. }
  32. button {
  33. onclick: move |_| {
  34. *data.first_data.write() -= 1;
  35. },
  36. "Decrease"
  37. }
  38. button {
  39. onclick: move |_| {
  40. *data.first_data.write() = 0;
  41. },
  42. "Reset"
  43. }
  44. "{data.first_data}"
  45. }
  46. }
  47. #[component]
  48. fn ReadsSecond() -> Element {
  49. println!("running second");
  50. let mut data = use_context::<ApplicationData>();
  51. rsx! {
  52. button { onclick: move |_| data.second_data += 1, "Increase" }
  53. button { onclick: move |_| data.second_data -= 1, "Decrease" }
  54. button { onclick: move |_| data.second_data.set(0), "Reset" }
  55. "{data.second_data}"
  56. }
  57. }
  58. #[component]
  59. fn ReadsManySignals() -> Element {
  60. println!("running many signals");
  61. let mut data = use_context::<ApplicationData>();
  62. rsx! {
  63. button {
  64. onclick: move |_| data.many_signals.write().push(Signal::new(0)),
  65. "Create"
  66. }
  67. button {
  68. onclick: move |_| { data.many_signals.write().pop(); },
  69. "Destroy"
  70. }
  71. button {
  72. onclick: move |_| {
  73. if let Some(mut first) = data.many_signals.read().first().cloned() {
  74. first += 1;
  75. }
  76. },
  77. "Increase First Item"
  78. }
  79. for signal in data.many_signals.iter() {
  80. Child { count: *signal }
  81. }
  82. }
  83. }
  84. #[component]
  85. fn Child(mut count: Signal<i32>) -> Element {
  86. println!("running child");
  87. rsx! {
  88. div {
  89. "Child: {count}"
  90. button { onclick: move |_| count += 1, "Increase" }
  91. button { onclick: move |_| count -= 1, "Decrease" }
  92. }
  93. }
  94. }