Hooks
Dioxus now uses signals as the backing for its state management. Signals are a smarter, more flexible version of the use_ref
hook. Signals now back many hooks in dioxus to provide a more consistent and flexible API.
State Hooks
State hooks are now backed by signals. use_state
, use_ref
, and use_shared_state
have been replaced with the use_signal
hook. The use_signal
hook is a more flexible and powerful version of the use_ref
hook with smarter scopes that only subscribe to a signal if that signal is read within the scope. You can read more about the use_signal
hook in the State Migration guide.
Async Hooks
The use_future
hook has been replaced with the use_resource
hook. use_resource
automatically subscribes to any signals that are read within the closure instead of using a tuple of dependencies.
Dioxus 0.4:
fn MyComponent(cx: Scope) -> Element { let state = use_state(cx, || 0); let my_resource = use_future(cx, (**state,), |(state,)| async move { // start a request that depends on the state println!("{state}"); }); render! { "{state}" } }
Dioxus 0.5:
fn MyComponent() -> Element { let state = use_signal(|| 0); // No need to manually set the dependencies, the use_resource hook will automatically detect signal dependencies let my_resource = use_resource(move || async move { // start a request that depends on the state // Because we read from the state signal, this future will be re-run whenever the state changes println!("{state}"); }); rsx! {"{state}"} }
Dependencies
Some hooks including use_effect
and use_resource
now take a single closure with automatic subscriptions instead of a tuple of dependencies. You can read more about the use_resource
hook in the Hook Migration guide.
Dioxus 0.4:
fn HasDependencies(cx: Scope) -> Element { let state = use_state(cx, || 0); let my_resource = use_resource(cx, (**state,), |(state,)| async move { println!("{state}"); }); let state_plus_one = use_memo(cx, (**state,), |(state,)| { state() + 1 }); render! { "{state_plus_one}" } }
Dioxus 0.5:
fn HasDependencies() -> Element { let state = use_signal(|| 0); // No need to manually set the dependencies, the use_resource hook will automatically detect signal dependencies let my_resource = use_resource(move || async move { // Because we read from the state signal, this future will be re-run whenever the state changes println!("{state}"); }); let state_plus_one = use_memo(move || { // Because we read from the state signal, this future will be re-run whenever the state changes state() + 1 }); rsx! {"{state_plus_one}"} }