diff --git a/packages/yew/src/virtual_dom/vtag.rs b/packages/yew/src/virtual_dom/vtag.rs index 51eeb8677df..2dc5bb57f76 100644 --- a/packages/yew/src/virtual_dom/vtag.rs +++ b/packages/yew/src/virtual_dom/vtag.rs @@ -8,6 +8,7 @@ use std::borrow::Cow; use std::cmp::PartialEq; use std::hint::unreachable_unchecked; use std::marker::PhantomData; +use std::mem; use std::ops::Deref; use std::rc::Rc; use wasm_bindgen::JsCast; @@ -430,8 +431,22 @@ impl VTag { .insert(key, value.into_prop_value()); } + /// Add event listener on the [VTag]'s [Element]. + /// Returns `true` if the listener has been added, `false` otherwise. + pub fn add_listener(&mut self, listener: Rc) -> bool { + if let Listeners::Pending(listeners) = &mut self.listeners { + let mut listeners = mem::take(listeners).into_vec(); + listeners.push(Some(listener)); + + self.set_listeners(listeners.into_boxed_slice()); + true + } else { + false + } + } + /// Set event listeners on the [VTag]'s [Element] - pub fn set_listener(&mut self, listeners: Box<[Option>]>) { + pub fn set_listeners(&mut self, listeners: Box<[Option>]>) { self.listeners = Listeners::Pending(listeners); }