diff --git a/leptos/src/suspense_component.rs b/leptos/src/suspense_component.rs
index b311455b65..117177bd71 100644
--- a/leptos/src/suspense_component.rs
+++ b/leptos/src/suspense_component.rs
@@ -1,5 +1,7 @@
use leptos_dom::{DynChild, HydrationCtx, IntoView};
use leptos_macro::component;
+#[cfg(any(feature = "csr", feature = "hydrate"))]
+use leptos_reactive::SignalGet;
use leptos_reactive::{
create_memo, provide_context, SignalGetUntracked, SuspenseContext,
};
@@ -93,6 +95,9 @@ where
let current_id = HydrationCtx::next_component();
+ #[cfg(any(feature = "csr", feature = "hydrate"))]
+ let ready = context.ready();
+
let child = DynChild::new({
move || {
// pull lazy memo before checking if context is ready
@@ -100,7 +105,7 @@ where
#[cfg(any(feature = "csr", feature = "hydrate"))]
{
- if context.ready() {
+ if ready.get() {
children_rendered
} else {
fallback.get_untracked()
diff --git a/leptos/src/transition.rs b/leptos/src/transition.rs
index ca8cc55bd0..16fd1fb510 100644
--- a/leptos/src/transition.rs
+++ b/leptos/src/transition.rs
@@ -99,7 +99,9 @@ where
cfg!(feature = "csr") && first_run.get();
let is_first_run =
is_first_run(first_run, &suspense_context);
- first_run.set(false);
+ if was_first_run {
+ first_run.set(false)
+ }
if let Some(prev_children) = &*prev_child.borrow() {
if is_first_run || was_first_run {
diff --git a/leptos_reactive/src/suspense.rs b/leptos_reactive/src/suspense.rs
index 4e762c40c7..3f5f9e882a 100644
--- a/leptos_reactive/src/suspense.rs
+++ b/leptos_reactive/src/suspense.rs
@@ -1,9 +1,9 @@
//! Types that handle asynchronous data loading via ``.
use crate::{
- create_isomorphic_effect, create_rw_signal, create_signal, oco::Oco,
- queue_microtask, signal::SignalGet, store_value, ReadSignal, RwSignal,
- SignalSet, SignalUpdate, StoredValue, WriteSignal,
+ create_isomorphic_effect, create_memo, create_rw_signal, create_signal,
+ oco::Oco, queue_microtask, signal::SignalGet, store_value, Memo,
+ ReadSignal, RwSignal, SignalSet, SignalUpdate, StoredValue, WriteSignal,
};
use futures::Future;
use std::{cell::RefCell, collections::VecDeque, pin::Pin, rc::Rc};
@@ -154,10 +154,9 @@ impl SuspenseContext {
}
/// Tests whether all of the pending resources have resolved.
- pub fn ready(&self) -> bool {
- self.pending_resources
- .try_with(|n| *n == 0)
- .unwrap_or(false)
+ pub fn ready(&self) -> Memo {
+ let pending = self.pending_resources;
+ create_memo(move |_| pending.try_with(|n| *n == 0).unwrap_or(false))
}
}
diff --git a/router/src/components/outlet.rs b/router/src/components/outlet.rs
index 9a0de47ba6..58b0e96890 100644
--- a/router/src/components/outlet.rs
+++ b/router/src/components/outlet.rs
@@ -72,7 +72,7 @@ pub fn Outlet() -> impl IntoView {
move |prev| {
let outlet = outlet.get();
let is_fallback =
- !global_suspense.with_inner(SuspenseContext::ready);
+ !global_suspense.with_inner(|c| c.ready().get());
if prev.is_none() {
set_current_view.set(outlet);
} else if !is_fallback {
@@ -81,7 +81,7 @@ pub fn Outlet() -> impl IntoView {
move || {
let is_fallback = untrack(move || {
!global_suspense
- .with_inner(SuspenseContext::ready)
+ .with_inner(|c| c.ready().get())
});
if !is_fallback {
set_current_view.set(outlet);
diff --git a/router/src/components/routes.rs b/router/src/components/routes.rs
index 73c726368b..f6202fa175 100644
--- a/router/src/components/routes.rs
+++ b/router/src/components/routes.rs
@@ -451,8 +451,7 @@ fn root_route(
create_effect(move |prev| {
let root = root_view.get();
- let is_fallback =
- !global_suspense.with_inner(SuspenseContext::ready);
+ let is_fallback = !global_suspense.with_inner(|c| c.ready().get());
if prev.is_none() {
set_current_view.set(root);
} else if !is_fallback {
@@ -460,7 +459,7 @@ fn root_route(
let global_suspense = global_suspense.clone();
move || {
let is_fallback = untrack(move || {
- !global_suspense.with_inner(SuspenseContext::ready)
+ !global_suspense.with_inner(|c| c.ready().get())
});
if !is_fallback {
set_current_view.set(root);