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/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 {