diff --git a/packages/yew/src/suspense/component.rs b/packages/yew/src/suspense/component.rs index 163a6c3d5..6d5a8d616 100644 --- a/packages/yew/src/suspense/component.rs +++ b/packages/yew/src/suspense/component.rs @@ -87,6 +87,11 @@ mod feat_csr_ssr { return false; } + // If a suspension already exists, ignore it. + if self.suspensions.iter().any(|n| n == &m) { + return false; + } + self.suspensions.push(m); true diff --git a/packages/yew/tests/suspense.rs b/packages/yew/tests/suspense.rs index 10393f5fe..fd2f642fe 100644 --- a/packages/yew/tests/suspense.rs +++ b/packages/yew/tests/suspense.rs @@ -786,3 +786,40 @@ async fn resume_after_unmount() { let result = obtain_result(); assert_eq!(result.as_str(), "
Content replacement
"); } + +#[wasm_bindgen_test] +async fn test_duplicate_suspension() { + use yew::html::ChildrenProps; + + #[function_component] + fn FetchingProvider(props: &ChildrenProps) -> HtmlResult { + use_future(|| async { + sleep(Duration::ZERO).await; + })?; + Ok(html! { <>{props.children.clone()} }) + } + + #[function_component] + fn Child() -> Html { + html! {
{"hello!"}
} + } + + #[function_component] + fn App() -> Html { + let fallback = Html::default(); + html! { + + + + + + } + } + + yew::Renderer::::with_root(gloo::utils::document().get_element_by_id("output").unwrap()) + .render(); + + sleep(Duration::from_millis(50)).await; + let result = obtain_result(); + assert_eq!(result.as_str(), "hello!"); +}