From 2a13609efffa82526b5a9108554365e8ee0802ad Mon Sep 17 00:00:00 2001 From: Greg Johnston Date: Tue, 4 Apr 2023 20:50:50 -0400 Subject: [PATCH] fix: fixes #802 as a temporary measure without resorting to #803 yet (#804) --- leptos/src/show.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/leptos/src/show.rs b/leptos/src/show.rs index 7ee502624..94bce8d71 100644 --- a/leptos/src/show.rs +++ b/leptos/src/show.rs @@ -1,6 +1,7 @@ use leptos::component; use leptos_dom::{Fragment, IntoView}; -use leptos_reactive::{create_memo, signal_prelude::*, Scope}; +use leptos_reactive::{create_memo, signal_prelude::*, Scope, ScopeDisposer}; +use std::{cell::RefCell, rc::Rc}; /// A component that will show its children when the `when` condition is `true`, /// and show the fallback when it is `false`, without rerendering every time @@ -45,9 +46,18 @@ where IV: IntoView, { let memoized_when = create_memo(cx, move |_| when()); + let prev_disposer = Rc::new(RefCell::new(None::)); - move || match memoized_when.get() { - true => children(cx).into_view(cx), - false => fallback(cx).into_view(cx), + move || { + if let Some(disposer) = prev_disposer.take() { + disposer.dispose(); + } + let (view, disposer) = + cx.run_child_scope(|cx| match memoized_when.get() { + true => children(cx).into_view(cx), + false => fallback(cx).into_view(cx), + }); + *prev_disposer.borrow_mut() = Some(disposer); + view } }