Skip to content

Commit ec4bd76

Browse files
authored
fix: suppress warning about non-reactivity when calling .refetch() (occurs in e.g., async blocks in actions) (#1576)
* fix: suppress warning about non-reactivity when calling `.refetch()` (occurs in e.g., async blocks in actions) * fix: don't reenter reactivity if these are nested
1 parent 65d4e98 commit ec4bd76

File tree

5 files changed

+44
-30
lines changed

5 files changed

+44
-30
lines changed

leptos_dom/src/events.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ pub fn add_event_listener<E>(
5959
if #[cfg(debug_assertions)] {
6060
let span = ::tracing::Span::current();
6161
let cb = Box::new(move |e| {
62-
leptos_reactive::SpecialNonReactiveZone::enter();
62+
let prev = leptos_reactive::SpecialNonReactiveZone::enter();
6363
let _guard = span.enter();
6464
cb(e);
65-
leptos_reactive::SpecialNonReactiveZone::exit();
65+
leptos_reactive::SpecialNonReactiveZone::exit(prev);
6666
});
6767
}
6868
}
@@ -88,10 +88,10 @@ pub(crate) fn add_event_listener_undelegated<E>(
8888
if #[cfg(debug_assertions)] {
8989
let span = ::tracing::Span::current();
9090
let cb = Box::new(move |e| {
91-
leptos_reactive::SpecialNonReactiveZone::enter();
91+
let prev = leptos_reactive::SpecialNonReactiveZone::enter();
9292
let _guard = span.enter();
9393
cb(e);
94-
leptos_reactive::SpecialNonReactiveZone::exit();
94+
leptos_reactive::SpecialNonReactiveZone::exit(prev);
9595
});
9696
}
9797
}

leptos_dom/src/helpers.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ pub fn set_timeout_with_handle(
218218
if #[cfg(debug_assertions)] {
219219
let span = ::tracing::Span::current();
220220
let cb = move || {
221-
leptos_reactive::SpecialNonReactiveZone::enter();
221+
let prev = leptos_reactive::SpecialNonReactiveZone::enter();
222222
let _guard = span.enter();
223223
cb();
224-
leptos_reactive::SpecialNonReactiveZone::exit();
224+
leptos_reactive::SpecialNonReactiveZone::exit(prev);
225225
};
226226
}
227227
}
@@ -273,10 +273,10 @@ pub fn debounce<T: 'static>(
273273
if #[cfg(debug_assertions)] {
274274
let span = ::tracing::Span::current();
275275
let cb = move |value| {
276-
leptos_reactive::SpecialNonReactiveZone::enter();
276+
let prev = leptos_reactive::SpecialNonReactiveZone::enter();
277277
let _guard = span.enter();
278278
cb(value);
279-
leptos_reactive::SpecialNonReactiveZone::exit();
279+
leptos_reactive::SpecialNonReactiveZone::exit(prev);
280280
};
281281
}
282282
}
@@ -351,10 +351,10 @@ pub fn set_interval_with_handle(
351351
if #[cfg(debug_assertions)] {
352352
let span = ::tracing::Span::current();
353353
let cb = move || {
354-
leptos_reactive::SpecialNonReactiveZone::enter();
354+
let prev = leptos_reactive::SpecialNonReactiveZone::enter();
355355
let _guard = span.enter();
356356
cb();
357-
leptos_reactive::SpecialNonReactiveZone::exit();
357+
leptos_reactive::SpecialNonReactiveZone::exit(prev);
358358
};
359359
}
360360
}
@@ -392,10 +392,10 @@ pub fn window_event_listener_untyped(
392392
if #[cfg(debug_assertions)] {
393393
let span = ::tracing::Span::current();
394394
let cb = move |e| {
395-
leptos_reactive::SpecialNonReactiveZone::enter();
395+
let prev = leptos_reactive::SpecialNonReactiveZone::enter();
396396
let _guard = span.enter();
397397
cb(e);
398-
leptos_reactive::SpecialNonReactiveZone::exit();
398+
leptos_reactive::SpecialNonReactiveZone::exit(prev);
399399
};
400400
}
401401
}

leptos_reactive/src/diagnostics.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,18 @@ impl SpecialNonReactiveZone {
4343
false
4444
}
4545

46-
#[inline(always)]
47-
pub fn enter() {
48-
#[cfg(debug_assertions)]
49-
{
50-
IS_SPECIAL_ZONE.with(|val| val.set(true))
51-
}
46+
#[cfg(debug_assertions)]
47+
pub fn enter() -> bool {
48+
IS_SPECIAL_ZONE.with(|val| {
49+
let prev = val.get();
50+
val.set(true);
51+
prev
52+
})
5253
}
5354

54-
#[inline(always)]
55-
pub fn exit() {
56-
#[cfg(debug_assertions)]
57-
{
55+
#[cfg(debug_assertions)]
56+
pub fn exit(prev: bool) {
57+
if !prev {
5858
IS_SPECIAL_ZONE.with(|val| val.set(false))
5959
}
6060
}

leptos_reactive/src/resource.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
signal_prelude::format_signal_warning, spawn::spawn_local, use_context,
55
GlobalSuspenseContext, Memo, ReadSignal, ScopeProperty, SignalDispose,
66
SignalGet, SignalGetUntracked, SignalSet, SignalUpdate, SignalWith,
7-
SuspenseContext, WriteSignal,
7+
SpecialNonReactiveZone, SuspenseContext, WriteSignal,
88
};
99
use std::{
1010
any::Any,
@@ -523,7 +523,13 @@ where
523523
pub fn refetch(&self) {
524524
_ = with_runtime(|runtime| {
525525
runtime.resource(self.id, |resource: &ResourceState<S, T>| {
526-
resource.refetch()
526+
#[cfg(debug_assertions)]
527+
let prev = SpecialNonReactiveZone::enter();
528+
resource.refetch();
529+
#[cfg(debug_assertions)]
530+
{
531+
SpecialNonReactiveZone::exit(prev);
532+
}
527533
})
528534
});
529535
}

leptos_reactive/src/runtime.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -776,9 +776,12 @@ impl RuntimeId {
776776
with_runtime(|runtime| {
777777
let untracked_result;
778778

779-
if !diagnostics {
780-
SpecialNonReactiveZone::enter();
781-
}
779+
#[cfg(debug_assertions)]
780+
let prev = if !diagnostics {
781+
SpecialNonReactiveZone::enter()
782+
} else {
783+
false
784+
};
782785

783786
let prev_observer =
784787
SetObserverOnDrop(self, runtime.observer.take());
@@ -788,8 +791,9 @@ impl RuntimeId {
788791
runtime.observer.set(prev_observer.1);
789792
std::mem::forget(prev_observer); // avoid Drop
790793

794+
#[cfg(debug_assertions)]
791795
if !diagnostics {
792-
SpecialNonReactiveZone::exit();
796+
SpecialNonReactiveZone::exit(prev);
793797
}
794798

795799
untracked_result
@@ -1235,9 +1239,13 @@ impl Drop for SetBatchingOnDrop {
12351239
pub fn on_cleanup(cleanup_fn: impl FnOnce() + 'static) {
12361240
#[cfg(debug_assertions)]
12371241
let cleanup_fn = move || {
1238-
crate::SpecialNonReactiveZone::enter();
1242+
#[cfg(debug_assertions)]
1243+
let prev = crate::SpecialNonReactiveZone::enter();
12391244
cleanup_fn();
1240-
crate::SpecialNonReactiveZone::exit();
1245+
#[cfg(debug_assertions)]
1246+
{
1247+
crate::SpecialNonReactiveZone::exit(prev);
1248+
}
12411249
};
12421250
push_cleanup(Box::new(cleanup_fn))
12431251
}

0 commit comments

Comments
 (0)