add optional dependency variants of selectors and effects
This commit is contained in:
1 parent
e2c08a79ae
commit
d6089bbd35
6 files changed
+174
-1
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user