fix use_effect_with_deps

This commit is contained in:
Jonathan Kelley committed 2024-02-02 14:49:33 -08:00
1 parent e8182b105e
commit 6bde8b0ce0
2 files changed
+31 -4

No files matched your search

+5
View File
@@ -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!" }
+26 -4
View File
@@ -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
} }