From 69dab86873a77caa8bddaecfae1e8bfafdc5e34b Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 8 Aug 2023 13:27:45 -0700 Subject: [PATCH] add selector example to readme --- packages/core/src/scope_context.rs | 2 +- packages/signals/README.md | 34 ++++++++++++++++++++++++++- packages/signals/examples/selector.rs | 30 +++++++++++++++++++++++ packages/signals/src/selector.rs | 2 +- 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 packages/signals/examples/selector.rs diff --git a/packages/core/src/scope_context.rs b/packages/core/src/scope_context.rs index 0861d063f..d627eea5f 100644 --- a/packages/core/src/scope_context.rs +++ b/packages/core/src/scope_context.rs @@ -245,7 +245,7 @@ impl ScopeContext { /// Schedule an update for any component given its [`ScopeId`]. /// -/// A component's [`ScopeId`] can be obtained from `use_hook` or the [`ScopeState::scope_id`] method. +/// A component's [`ScopeId`] can be obtained from `use_hook` or the [`crate::scopes::ScopeState::scope_id`] method. /// /// This method should be used when you want to schedule an update for a component pub fn schedule_update_any() -> Option> { diff --git a/packages/signals/README.md b/packages/signals/README.md index baac37867..020edc18f 100644 --- a/packages/signals/README.md +++ b/packages/signals/README.md @@ -1,6 +1,6 @@ # Dioxus Signals -Dioxus Signals is an ergonomic Copy runtime for data with local subscriptions in Dioxus. +Dioxus Signals is an ergonomic Copy runtime for data with local subscriptions. ## Copy Data @@ -86,5 +86,37 @@ fn Child(cx: Scope) -> Element { "{signal}" } } +``` +## Computed Data + +In addition to local subscriptions in components, `dioxus-signals` provides a way to derive data with local subscriptions. + +The use_selector hook will only rerun when any signals inside of the hook change: + +```rust +use dioxus::prelude::*; +use dioxus_signals::*; + +fn app(cx: Scope) -> Element { + let signal = use_signal(cx, || 0); + let doubled = use_selector(cx, || signal * 2); + + render! { + button { + onclick: move |_| *signal.write() += 1, + "Increase" + } + Child { + signal: signal + } + } +} + +#[inline_props] +fn Child(cx: Scope, signal: ReadOnlySignal) -> Element { + render! { + "{signal}" + } +} ``` diff --git a/packages/signals/examples/selector.rs b/packages/signals/examples/selector.rs new file mode 100644 index 000000000..85d93ae7f --- /dev/null +++ b/packages/signals/examples/selector.rs @@ -0,0 +1,30 @@ +#![allow(non_snake_case)] + +use dioxus::prelude::*; +use dioxus_signals::*; + +fn main() { + dioxus_desktop::launch(app); +} + +fn app(cx: Scope) -> Element { + let signal = use_signal(cx, || 0); + let doubled = use_selector(cx, move || signal * 2); + + render! { + button { + onclick: move |_| *signal.write() += 1, + "Increase" + } + Child { + signal: doubled + } + } +} + +#[inline_props] +fn Child(cx: Scope, signal: ReadOnlySignal) -> Element { + render! { + "{signal}" + } +} diff --git a/packages/signals/src/selector.rs b/packages/signals/src/selector.rs index 301f4495e..5eb3fa3c9 100644 --- a/packages/signals/src/selector.rs +++ b/packages/signals/src/selector.rs @@ -87,7 +87,7 @@ pub fn selector(mut f: impl FnMut() -> R + 'static) -> ReadOnlySig value: f(), }); { - // get_effect_stack().effects.borrow_mut().pop(); + get_effect_stack().effects.borrow_mut().pop(); } effect.callback.value.set(Box::new(move || {