Skip to content

Commit 93ace36

Browse files
authored
Infinite suspense fix (#31)
* improve demo docs * use hydration context * fix clippy error * fix clippy error * remove execute from resource fetcher
1 parent 9a1bec1 commit 93ace36

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

query/src/use_query.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::query_result::QueryResult;
44
use crate::{
55
query_is_suppressed, use_query_client, QueryOptions, QueryState, RefetchFn, ResourceOption,
66
};
7+
use leptos::leptos_dom::HydrationCtx;
78
use leptos::*;
89
use std::cell::Cell;
910
use std::future::Future;
@@ -119,22 +120,29 @@ where
119120
}
120121
});
121122

123+
// First read.
124+
{
125+
let query = query.get_untracked();
126+
127+
if resource.loading().get_untracked()
128+
&& !HydrationCtx::is_hydrating()
129+
&& query.with_state(|state| matches!(state, QueryState::Created))
130+
{
131+
query.execute()
132+
}
133+
}
134+
122135
let data = Signal::derive({
123136
move || {
124137
let read = resource.get().and_then(|r| r.0);
125-
let query = query.get_untracked();
126-
127-
// First Read.
128-
// Putting this in an effect will cause it to always refetch needlessly on the client after SSR.
129-
if read.is_none() && query.with_state(|state| matches!(state, QueryState::Created)) {
130-
query.execute()
131-
}
138+
let _ = read;
132139

133140
// SSR edge case.
134141
// Given hydrate can happen before resource resolves, signals on the client can be out of sync with resource.
135142
// Need to force insert the resource data into the query state.
136143
#[cfg(feature = "hydrate")]
137144
if let Some(ref data) = read {
145+
let query = query.get_untracked();
138146
if query.with_state(|state| matches!(state, QueryState::Created)) {
139147
let data = crate::QueryData::now(data.clone());
140148
query.set_state(QueryState::Loaded(data));

0 commit comments

Comments
 (0)