瀏覽代碼

add a warning about using use_hook(RefCell) in the docs (#3151)

Evan Almloff 7 月之前
父節點
當前提交
caa9759e44
共有 2 個文件被更改,包括 80 次插入0 次删除
  1. 40 0
      packages/core/src/global_context.rs
  2. 40 0
      packages/core/src/scope_context.rs

+ 40 - 0
packages/core/src/global_context.rs

@@ -222,6 +222,46 @@ pub fn remove_future(id: Task) {
 /// In order to clean up resources you would need to implement the [`Drop`] trait for an inner value stored in a RC or similar (Signals for instance),
 /// as these only drop their inner value once all references have been dropped, which only happens when the component is dropped.
 ///
+/// <div class="warning">
+///
+/// `use_hook` is not reactive. It just returns the value on every render. If you need state that will track changes, use [`use_signal`](dioxus::prelude::use_signal) instead.
+///
+/// ❌ Don't use `use_hook` with `Rc<RefCell<T>>` for state. It will not update the UI and other hooks when the state changes.
+/// ```rust
+/// use dioxus::prelude::*;
+/// use std::rc::Rc;
+/// use std::cell::RefCell;
+///
+/// pub fn Comp() -> Element {
+///     let count = use_hook(|| Rc::new(RefCell::new(0)));
+///
+///     rsx! {
+///         button {
+///             onclick: move |_| *count.borrow_mut() += 1,
+///             "{count.borrow()}"
+///         }
+///     }
+/// }
+/// ```
+///
+/// ✅ Use `use_signal` instead.
+/// ```rust
+/// use dioxus::prelude::*;
+///
+/// pub fn Comp() -> Element {
+///     let mut count = use_signal(|| 0);
+///
+///     rsx! {
+///         button {
+///             onclick: move |_| count += 1,
+///             "{count}"
+///         }
+///     }
+/// }
+/// ```
+///
+/// </div>
+///
 /// # Example
 ///
 /// ```rust, no_run

+ 40 - 0
packages/core/src/scope_context.rs

@@ -367,6 +367,46 @@ impl Scope {
     /// In order to clean up resources you would need to implement the [`Drop`] trait for an inner value stored in a RC or similar (Signals for instance),
     /// as these only drop their inner value once all references have been dropped, which only happens when the component is dropped.
     ///
+    /// <div class="warning">
+    ///
+    /// `use_hook` is not reactive. It just returns the value on every render. If you need state that will track changes, use [`use_signal`](dioxus::prelude::use_signal) instead.
+    ///
+    /// ❌ Don't use `use_hook` with `Rc<RefCell<T>>` for state. It will not update the UI and other hooks when the state changes.
+    /// ```rust
+    /// use dioxus::prelude::*;
+    /// use std::rc::Rc;
+    /// use std::cell::RefCell;
+    ///
+    /// pub fn Comp() -> Element {
+    ///     let count = use_hook(|| Rc::new(RefCell::new(0)));
+    ///
+    ///     rsx! {
+    ///         button {
+    ///             onclick: move |_| *count.borrow_mut() += 1,
+    ///             "{count.borrow()}"
+    ///         }
+    ///     }
+    /// }
+    /// ```
+    ///
+    /// ✅ Use `use_signal` instead.
+    /// ```rust
+    /// use dioxus::prelude::*;
+    ///
+    /// pub fn Comp() -> Element {
+    ///     let mut count = use_signal(|| 0);
+    ///
+    ///     rsx! {
+    ///         button {
+    ///             onclick: move |_| count += 1,
+    ///             "{count}"
+    ///         }
+    ///     }
+    /// }
+    /// ```
+    ///
+    /// </div>
+    ///
     /// # Example
     ///
     /// ```rust