From ea3d88c1dd1fadb6d20b3810e3701a94ace5c3e3 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Wed, 24 Jul 2024 01:57:05 +0200 Subject: [PATCH] Fix spread props diffing (#2679) * Fix spread props diffing * Add a regression test for extends prop diffing --- packages/core-macro/src/props/mod.rs | 1 + .../tests/values_memoize_in_place.rs | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/packages/core-macro/src/props/mod.rs b/packages/core-macro/src/props/mod.rs index 091c71fd8..aa708fe82 100644 --- a/packages/core-macro/src/props/mod.rs +++ b/packages/core-macro/src/props/mod.rs @@ -640,6 +640,7 @@ mod struct_info { let regular_fields: Vec<_> = self .included_fields() + .chain(self.extend_fields()) .filter(|f| !looks_like_signal_type(f.ty) && !looks_like_callback_type(f.ty)) .map(|f| { let name = f.name; diff --git a/packages/core-macro/tests/values_memoize_in_place.rs b/packages/core-macro/tests/values_memoize_in_place.rs index b40134eb8..974b2d158 100644 --- a/packages/core-macro/tests/values_memoize_in_place.rs +++ b/packages/core-macro/tests/values_memoize_in_place.rs @@ -134,3 +134,32 @@ fn TakesSignal(sig: ReadOnlySignal, number: usize) -> Element { button { "{number}" } } } + +// Regression test for https://github.com/DioxusLabs/dioxus/issues/2582 +#[test] +fn spreads_memorize_in_place() { + #[derive(Props, Clone, PartialEq)] + struct CompProps { + #[props(extends = GlobalAttributes)] + attributes: Vec, + } + + let mut props = CompProps::builder().build(); + assert!(!props.memoize(&CompProps::builder().all("123").build())); + assert_eq!( + props.attributes, + vec![Attribute::new("all", "123", Some("style"), false)] + ); + + assert!(!props.memoize(&CompProps::builder().width("123").build())); + assert_eq!( + props.attributes, + vec![Attribute::new("width", "123", Some("style"), false)] + ); + + assert!(!props.memoize(&CompProps::builder().build())); + assert_eq!(props.attributes, vec![]); + + assert!(props.memoize(&CompProps::builder().build())); + assert_eq!(props.attributes, vec![]); +}