diff --git a/examples/todomvc.rs b/examples/todomvc.rs index f3cb59f09..d5e56dd1a 100644 --- a/examples/todomvc.rs +++ b/examples/todomvc.rs @@ -7,8 +7,6 @@ fn main() { dioxus_desktop::launch(app); } -const _STYLE: &str = manganis::mg!(file("./examples/assets/todomvc.css")); - #[derive(PartialEq, Eq, Clone, Copy)] pub enum FilterState { All, @@ -49,6 +47,7 @@ pub fn app(cx: Scope<()>) -> Element { cx.render(rsx! { section { class: "todoapp", + style { {include_str!("./assets/todomvc.css")} } TodoHeader { todos: todos } section { class: "main", if !todos.is_empty() { diff --git a/packages/autofmt/tests/samples/attributes.rsx b/packages/autofmt/tests/samples/attributes.rsx index fa08b1cf4..4a0bdcdda 100644 --- a/packages/autofmt/tests/samples/attributes.rsx +++ b/packages/autofmt/tests/samples/attributes.rsx @@ -12,18 +12,6 @@ rsx! { let blah = 120; true }, - onclick: move |_| { - let blah = 120; - true - }, - onclick: move |_| { - let blah = 120; - true - }, - onclick: move |_| { - let blah = 120; - true - }, div { div { "hi" } h2 { class: "asd" } diff --git a/packages/autofmt/tests/samples/complex.rsx b/packages/autofmt/tests/samples/complex.rsx index 56c16e657..6ee62cfa5 100644 --- a/packages/autofmt/tests/samples/complex.rsx +++ b/packages/autofmt/tests/samples/complex.rsx @@ -6,7 +6,7 @@ rsx! { show_user_menu.set(!show_user_menu.get()); evt.cancel_bubble(); }, - onclick: move |evt| show_user_menu.set(!show_user_menu.get()), + onmousedown: move |evt| show_user_menu.set(!show_user_menu.get()), span { class: "inline-block mr-4", icons::icon_14 {} } span { "Settings" } } diff --git a/packages/core/src/virtual_dom.rs b/packages/core/src/virtual_dom.rs index 932f9cbfb..2330edd77 100644 --- a/packages/core/src/virtual_dom.rs +++ b/packages/core/src/virtual_dom.rs @@ -401,13 +401,6 @@ impl VirtualDom { } } }); - - // Break if this is the exact target element. - // This means we won't call two listeners with the same name on the same element. This should be - // documented, or be rejected from the rsx! macro outright - if target_path == this_path { - break; - } } } diff --git a/packages/html/Cargo.toml b/packages/html/Cargo.toml index 82d1640e3..78d0a3caa 100644 --- a/packages/html/Cargo.toml +++ b/packages/html/Cargo.toml @@ -52,6 +52,8 @@ serde_json = "1" [features] default = ["serialize", "mounted", "eval"] serialize = [ + "serde", + "serde_json", "serde_repr", "euclid/serde", "keyboard-types/serde", diff --git a/packages/rsx/src/element.rs b/packages/rsx/src/element.rs index 7d7a9a3c8..42812b66c 100644 --- a/packages/rsx/src/element.rs +++ b/packages/rsx/src/element.rs @@ -99,6 +99,27 @@ impl Parse for Element { let span = content.span(); if name_str.starts_with("on") { + // check for any duplicate event listeners + if attributes.iter().any(|f| { + if let AttributeType::Named(ElementAttrNamed { + attr: + ElementAttr { + name: ElementAttrName::BuiltIn(n), + value: ElementAttrValue::EventTokens(_), + }, + .. + }) = f + { + n == &name_str + } else { + false + } + }) { + return Err(syn::Error::new( + name.span(), + format!("Duplicate event listener `{}`", name), + )); + } attributes.push(attribute::AttributeType::Named(ElementAttrNamed { el_name: el_name.clone(), attr: ElementAttr {