add optional dependency variants of selectors and effects

This commit is contained in:
Evan Almloff committed 2023-08-08 13:06:33 -07:00
1 parent e2c08a79ae
commit d6089bbd35
6 files changed
+174 -1

No files matched your search

+26 -1
View File
@@ -1,9 +1,12 @@
use core::{self, fmt::Debug};
use std::fmt::{self, Formatter};
use std::marker::PhantomData;
use dioxus_core::prelude::*;
use crate::CopyValue;
use crate::dependency::Dep;
use crate::{dependency::Dependency, CopyValue};
use crate::{use_signal, Signal};
#[derive(Default, Clone, Copy)]
pub(crate) struct EffectStack {
@@ -26,6 +29,28 @@ pub fn use_effect(cx: &ScopeState, callback: impl FnMut() + 'static) {
cx.use_hook(|| Effect::new(callback));
}
/// Create a new effect. The effect will be run immediately and whenever any signal it reads changes.
/// The signal will be owned by the current component and will be dropped when the component is dropped.
pub fn use_effect_with_dependencies<D: Dependency>(
cx: &ScopeState,
dependencies: D,
mut callback: impl FnMut(D::Out) + 'static,
) where
D::Out: 'static,
{
let dependencies_signal = use_signal(cx, || dependencies.out());
cx.use_hook(|| {
Effect::new(move || {
let deref = &*dependencies_signal.read();
callback(deref.clone());
});
});
let changed = { dependencies.changed(&*dependencies_signal.read()) };
if changed {
dependencies_signal.set(dependencies.out());
}
}
/// Effects allow you to run code when a signal changes. Effects are run immediately and whenever any signal it reads changes.
#[derive(Copy, Clone, PartialEq)]
pub struct Effect {