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!");
+}