diff --git a/packages/core-macro/src/props/mod.rs b/packages/core-macro/src/props/mod.rs index f7b0a51db..f680c978f 100644 --- a/packages/core-macro/src/props/mod.rs +++ b/packages/core-macro/src/props/mod.rs @@ -1481,7 +1481,6 @@ Finally, call `.build()` to create the instance of `{name}`. quote! { #[doc(hidden)] #[allow(dead_code, non_camel_case_types, missing_docs)] - #[derive(Clone)] #vis struct #name #generics_with_bounds #where_clause { inner: #original_name #ty_generics, owner: dioxus_core::internal::generational_box::Owner, @@ -1493,6 +1492,15 @@ Finally, call `.build()` to create the instance of `{name}`. } } + impl #original_impl_generics Clone for #name #ty_generics #where_clause { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + owner: self.owner.clone(), + } + } + } + impl #original_impl_generics #name #ty_generics #where_clause { /// Create a component from the props. pub fn into_vcomponent( diff --git a/packages/core-macro/tests/generics.rs b/packages/core-macro/tests/generics.rs index d83867493..b2fe77f24 100644 --- a/packages/core-macro/tests/generics.rs +++ b/packages/core-macro/tests/generics.rs @@ -1,4 +1,4 @@ -use std::fmt::Display; +use std::{fmt::Display, marker::PhantomData}; use dioxus::prelude::*; @@ -104,4 +104,39 @@ fn generic_props_compile() { p { "{value}" } } } + + #[derive(Props)] + struct PropsWithOwnerOnlyRequiresStatic { + value: PhantomData, + trigger_owner: EventHandler<()>, + } + + impl PartialEq for PropsWithOwnerOnlyRequiresStatic { + fn eq(&self, _: &Self) -> bool { + true + } + } + + impl Clone for PropsWithOwnerOnlyRequiresStatic { + fn clone(&self) -> Self { + PropsWithOwnerOnlyRequiresStatic { + value: PhantomData, + trigger_owner: self.trigger_owner, + } + } + } + + fn ReadSignalNoCloneWithOwner(props: PropsWithOwnerOnlyRequiresStatic) -> Element { + rsx! {} + } + + #[component] + fn ReadSignalNoClone(value: ReadSignal) -> Element + where + T: PartialEq + Display + 'static, + { + rsx! { + p { "{value}" } + } + } }