1
0

use_memo.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use dioxus_core::ScopeState;
  2. use crate::UseFutureDep;
  3. /// A hook that provides a callback that executes if the dependencies change.
  4. /// This is useful to avoid running computation-expensive calculations even when the data doesn't change.
  5. ///
  6. /// - dependencies: a tuple of references to values that are `PartialEq` + `Clone`
  7. ///
  8. /// ## Examples
  9. ///
  10. /// ```rust, no_run
  11. /// # use dioxus::prelude::*;
  12. ///
  13. /// #[component]
  14. /// fn Calculator(cx: Scope, number: usize) -> Element {
  15. /// let bigger_number = use_memo(cx, (number,), |(number,)| {
  16. /// // This will only be calculated when `number` has changed.
  17. /// number * 100
  18. /// });
  19. /// render!(
  20. /// p { "{bigger_number}" }
  21. /// )
  22. /// }
  23. ///
  24. /// #[component]
  25. /// fn App(cx: Scope) -> Element {
  26. /// render!(Calculator { number: 0 })
  27. /// }
  28. /// ```
  29. pub fn use_memo<T, D>(cx: &ScopeState, dependencies: D, callback: impl FnOnce(D::Out) -> T) -> &T
  30. where
  31. T: 'static,
  32. D: UseFutureDep,
  33. {
  34. let value = cx.use_hook(|| None);
  35. let dependancies_vec = cx.use_hook(Vec::new);
  36. if dependencies.clone().apply(dependancies_vec) || value.is_none() {
  37. // Create the new value
  38. *value = Some(callback(dependencies.out()));
  39. }
  40. value.as_ref().unwrap()
  41. }