memo_chain.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. use dioxus::prelude::*;
  2. fn main() {
  3. launch_desktop(app);
  4. }
  5. fn app() -> Element {
  6. let mut value = use_signal(|| 0);
  7. let mut depth = use_signal(|| 0_usize);
  8. let items = use_memo(move || (0..depth()).map(|f| f as _).collect::<Vec<isize>>());
  9. let state = use_memo(move || value() + 1);
  10. println!("rendering app");
  11. rsx! {
  12. button { onclick: move |_| value += 1, "Increment" }
  13. button { onclick: move |_| depth += 1, "Add depth" }
  14. button { onclick: move |_| depth -= 1, "Remove depth" }
  15. Child { depth, items, state }
  16. }
  17. }
  18. #[component]
  19. fn Child(
  20. state: ReadOnlySignal<isize>,
  21. items: ReadOnlySignal<Vec<isize>>,
  22. depth: ReadOnlySignal<usize>,
  23. ) -> Element {
  24. if depth() == 0 {
  25. return None;
  26. }
  27. // These memos don't get re-computed when early returns happen
  28. let state = use_memo(move || state() + 1);
  29. let item = use_memo(move || items()[depth()]);
  30. let depth = use_memo(move || depth() - 1);
  31. println!("rendering child: {}", depth());
  32. rsx! {
  33. h3 { "Depth({depth})-Item({item}): {state}"}
  34. Child { depth, state, items }
  35. }
  36. }