fix use_effect_with_deps
This commit is contained in:
2 files changed
+31
-4
No files matched your search
@@ -9,6 +9,11 @@ fn main() {
|
|||||||
fn app() -> Element {
|
fn app() -> Element {
|
||||||
let mut count = use_signal(|| 0);
|
let mut count = use_signal(|| 0);
|
||||||
|
|
||||||
|
let g: ReadOnlySignal<(), UnsyncStorage> =
|
||||||
|
use_maybe_sync_selector_with_dependencies((&(count())), move |deps| {
|
||||||
|
println!("High-Five counter: {}", deps);
|
||||||
|
});
|
||||||
|
|
||||||
rsx! {
|
rsx! {
|
||||||
h1 { "High-Five counter: {count}" }
|
h1 { "High-Five counter: {count}" }
|
||||||
button { onclick: move |_| count += 1, "Up high!" }
|
button { onclick: move |_| count += 1, "Up high!" }
|
||||||
|
|||||||
@@ -126,15 +126,37 @@ where
|
|||||||
D::Out: 'static,
|
D::Out: 'static,
|
||||||
{
|
{
|
||||||
let mut dependencies_signal = use_signal(|| dependencies.out());
|
let mut dependencies_signal = use_signal(|| dependencies.out());
|
||||||
|
|
||||||
let selector = use_hook(|| {
|
let selector = use_hook(|| {
|
||||||
Signal::maybe_sync_memo(move || {
|
// Get the current reactive context
|
||||||
let deref = &*dependencies_signal.read();
|
let rc = ReactiveContext::new(None);
|
||||||
f(deref.clone())
|
|
||||||
})
|
// Create a new signal in that context, wiring up its dependencies and subscribers
|
||||||
|
let mut state: Signal<R, S> =
|
||||||
|
rc.run_in(|| Signal::new_maybe_sync(f(dependencies_signal.read().clone())));
|
||||||
|
|
||||||
|
spawn(async move {
|
||||||
|
loop {
|
||||||
|
// Wait for the dom the be finished with sync work
|
||||||
|
flush_sync().await;
|
||||||
|
rc.changed().await;
|
||||||
|
|
||||||
|
let new = rc.run_in(|| f(dependencies_signal.read().clone()));
|
||||||
|
if new != *state.peek() {
|
||||||
|
*state.write() = new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// And just return the readonly variant of that signal
|
||||||
|
ReadOnlySignal::new_maybe_sync(state)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// This will cause a re-run of the selector if the dependencies change
|
||||||
let changed = { dependencies.changed(&*dependencies_signal.read()) };
|
let changed = { dependencies.changed(&*dependencies_signal.read()) };
|
||||||
if changed {
|
if changed {
|
||||||
dependencies_signal.set(dependencies.out());
|
dependencies_signal.set(dependencies.out());
|
||||||
}
|
}
|
||||||
|
|
||||||
selector
|
selector
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user