From fc2b441ee1b1ada5d81248842d9c9cf124dc2e9d Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 25 Apr 2024 23:48:06 -0500 Subject: [PATCH] Fix memorization for the fragment component (#2360) --- packages/core/src/error_boundary.rs | 3 ++- packages/core/src/fragment.rs | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/core/src/error_boundary.rs b/packages/core/src/error_boundary.rs index 88359dd1c..f107fa723 100644 --- a/packages/core/src/error_boundary.rs +++ b/packages/core/src/error_boundary.rs @@ -344,7 +344,8 @@ impl Properties for ErrorBoundaryProps { fn builder() -> Self::Builder { ErrorBoundaryProps::builder() } - fn memoize(&mut self, _: &Self) -> bool { + fn memoize(&mut self, other: &Self) -> bool { + *self = other.clone(); false } } diff --git a/packages/core/src/fragment.rs b/packages/core/src/fragment.rs index b41dabe81..68a12fff5 100644 --- a/packages/core/src/fragment.rs +++ b/packages/core/src/fragment.rs @@ -27,7 +27,7 @@ use crate::innerlude::*; /// You want to use this free-function when your fragment needs a key and simply returning multiple nodes from rsx! won't cut it. #[allow(non_upper_case_globals, non_snake_case)] pub fn Fragment(cx: FragmentProps) -> Element { - cx.0.clone() + cx.0 } #[derive(Clone, PartialEq)] @@ -90,7 +90,12 @@ impl Properties for FragmentProps { fn builder() -> Self::Builder { FragmentBuilder(None) } - fn memoize(&mut self, _other: &Self) -> bool { - false + fn memoize(&mut self, new: &Self) -> bool { + let equal = self == new; + if !equal { + let new_clone = new.clone(); + self.0 = new_clone.0; + } + equal } }