run effects in the scope they were created in
This commit is contained in:
1 parent
b0b7de3692
commit
458c13fb74
2 files changed
+9
-5
No files matched your search
@@ -231,7 +231,7 @@ impl ScopeContext {
|
|||||||
/// This is good for tasks that need to be run after the component has been dropped.
|
/// This is good for tasks that need to be run after the component has been dropped.
|
||||||
pub fn spawn_forever(&self, fut: impl Future<Output = ()> + 'static) -> Task {
|
pub fn spawn_forever(&self, fut: impl Future<Output = ()> + 'static) -> Task {
|
||||||
// The root scope will never be unmounted so we can just add the task at the top of the app
|
// The root scope will never be unmounted so we can just add the task at the top of the app
|
||||||
Runtime::with(|rt| rt.spawn(ScopeId::ROOT, fut)).expect("Runtime to exist")
|
Runtime::with(|rt| rt.spawn(self.id, fut)).expect("Runtime to exist")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Informs the scheduler that this task is no longer needed and should be removed.
|
/// Informs the scheduler that this task is no longer needed and should be removed.
|
||||||
@@ -386,6 +386,8 @@ impl ScopeId {
|
|||||||
|
|
||||||
/// Run a closure inside of scope's runtime
|
/// Run a closure inside of scope's runtime
|
||||||
pub fn in_runtime<T>(self, f: impl FnOnce() -> T) -> T {
|
pub fn in_runtime<T>(self, f: impl FnOnce() -> T) -> T {
|
||||||
Runtime::with_scope(self, |_| f()).expect("to be in a dioxus runtime")
|
Runtime::current()
|
||||||
|
.expect("to be in a dioxus runtime")
|
||||||
|
.on_scope(self, f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,10 +126,12 @@ impl Effect {
|
|||||||
/// Create a new effect. The effect will be run immediately and whenever any signal it reads changes.
|
/// 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.
|
/// The signal will be owned by the current component and will be dropped when the component is dropped.
|
||||||
pub fn new(callback: impl FnMut() + 'static) -> Self {
|
pub fn new(mut callback: impl FnMut() + 'static) -> Self {
|
||||||
|
let source = current_scope_id().expect("in a virtual dom");
|
||||||
let myself = Self {
|
let myself = Self {
|
||||||
source: current_scope_id().expect("in a virtual dom"),
|
source,
|
||||||
inner: EffectInner::new(Box::new(callback)),
|
#[allow(clippy::redundant_closure)]
|
||||||
|
inner: EffectInner::new(Box::new(move || source.in_runtime(|| callback()))),
|
||||||
};
|
};
|
||||||
|
|
||||||
EFFECT_STACK.with(|stack| {
|
EFFECT_STACK.with(|stack| {
|
||||||
|
|||||||
Reference in new issue
Block a user