memo_chain.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. use dioxus::prelude::*;
  2. fn main() {
  3. launch_desktop(app);
  4. }
  5. fn app() -> Element {
  6. let mut state = use_signal(|| 0);
  7. let mut depth = use_signal(|| 1 as usize);
  8. let mut items = use_memo(move || (0..depth()).map(|f| f as _).collect::<Vec<isize>>());
  9. let a = use_memo(move || state() + 1);
  10. println!("rendering app");
  11. rsx! {
  12. button { onclick: move |_| state += 1, "Increment" }
  13. button { onclick: move |_| depth += 1, "Add depth" }
  14. button { onclick: move |_| depth -= 1, "Remove depth" }
  15. Child {
  16. depth: depth.into(),
  17. items: items,
  18. state: a,
  19. }
  20. }
  21. }
  22. #[component]
  23. fn Child(
  24. state: ReadOnlySignal<isize>,
  25. items: ReadOnlySignal<Vec<isize>>,
  26. depth: ReadOnlySignal<usize>,
  27. ) -> Element {
  28. if depth() == 0 {
  29. return None;
  30. }
  31. println!("rendering child: {}", depth());
  32. let state = use_memo(move || state() + 1);
  33. let item = use_memo(move || items()[dbg!(depth()) - 1]);
  34. let depth = use_memo(move || depth() - 1);
  35. rsx! {
  36. h3 { "Depth({depth})-Item({item}): {state}"}
  37. Child {
  38. depth,
  39. state,
  40. items
  41. }
  42. }
  43. }