From f107c14733f45a7d540aa17d9d07497e56c7495e Mon Sep 17 00:00:00 2001 From: mc1098 Date: Thu, 12 Aug 2021 15:56:28 +0100 Subject: [PATCH 1/7] Refactor input and change event listeners InputData and ChangeData have been removed as they were overly restrictive, the implementation would only allow adding listeners to input, textarea, or select elements and would panic at runtime otherwise. TypedTarget trait should help with migration for getting the value from inputs etc. The user is much more likely to know what the target type is and this saves Yew trying to brute force what element the target type might be. This is convenient enough trait but follows the same theme of JsCast which might also be a nice way for new users to be introduced to what JsCast can do at a limited scope. --- packages/yew/src/functional/hooks/use_ref.rs | 9 +- packages/yew/src/html/listener/events.rs | 4 +- packages/yew/src/html/listener/mod.rs | 189 +++++++++++-------- packages/yew/src/lib.rs | 2 +- 4 files changed, 121 insertions(+), 83 deletions(-) diff --git a/packages/yew/src/functional/hooks/use_ref.rs b/packages/yew/src/functional/hooks/use_ref.rs index daf0ce5f9ad..7cafd0cf85e 100644 --- a/packages/yew/src/functional/hooks/use_ref.rs +++ b/packages/yew/src/functional/hooks/use_ref.rs @@ -9,7 +9,7 @@ use std::{cell::RefCell, rc::Rc}; /// /// # Example /// ```rust -/// # use yew::prelude::*; +/// # use yew::{prelude::*, web_sys::{Event, HtmlInputElement}}; /// # use std::rc::Rc; /// # use std::cell::RefCell; /// # use std::ops::{Deref, DerefMut}; @@ -32,10 +32,9 @@ use std::{cell::RefCell, rc::Rc}; /// /// let onchange = { /// let message = message.clone(); -/// Callback::from(move |e| { -/// if let ChangeData::Value(value) = e { -/// message.set(value) -/// } +/// Callback::from(move |e: Event| { +/// let input: HtmlInputElement = e.target_unchecked_into(); +/// message.set(input.value()) /// }) /// }; /// diff --git a/packages/yew/src/html/listener/events.rs b/packages/yew/src/html/listener/events.rs index 4865238a104..a8e0306acba 100644 --- a/packages/yew/src/html/listener/events.rs +++ b/packages/yew/src/html/listener/events.rs @@ -6,7 +6,7 @@ impl_action! { oncancel(name: "cancel", event: Event) -> web_sys::Event => |_, event| { event } oncanplay(name: "canplay", event: Event) -> web_sys::Event => |_, event| { event } oncanplaythrough(name: "canplaythrough", event: Event) -> web_sys::Event => |_, event| { event } - onchange(name: "change", event: Event) -> ChangeData => |this: &Element, _| { onchange_handler(this) } + onchange(name: "change", event: Event) -> web_sys::Event => |_, event| { event } onclick(name: "click", event: MouseEvent) -> web_sys::MouseEvent => |_, event| { event } onclose(name: "close", event: Event) -> web_sys::Event => |_, event| { event } oncontextmenu(name: "contextmenu", event: MouseEvent) -> web_sys::MouseEvent => |_, event| { event } @@ -29,7 +29,7 @@ impl_action! { onfocusout(name: "focusout", event: FocusEvent) -> web_sys::FocusEvent => |_, event| { event } // web_sys doesn't have a struct for `FormDataEvent` onformdata(name: "formdata", event: Event) -> web_sys::Event => |_, event| { event } - oninput(name: "input", event: InputEvent) -> InputData => |this: &Element, event| { oninput_handler(this, event) } + oninput(name: "input", event: InputEvent) -> web_sys::InputEvent => |_, event| { event } oninvalid(name: "invalid", event: Event) -> web_sys::Event => |_, event| { event } onkeydown(name: "keydown", event: KeyboardEvent) -> web_sys::KeyboardEvent => |_, event| { event } onkeypress(name: "keypress", event: KeyboardEvent) -> web_sys::KeyboardEvent => |_, event| { event } diff --git a/packages/yew/src/html/listener/mod.rs b/packages/yew/src/html/listener/mod.rs index d9427238fd2..ff868fb33fb 100644 --- a/packages/yew/src/html/listener/mod.rs +++ b/packages/yew/src/html/listener/mod.rs @@ -3,89 +3,128 @@ mod macros; mod events; use wasm_bindgen::JsCast; -use web_sys::{ - Element, FileList, HtmlInputElement as InputElement, HtmlSelectElement as SelectElement, - HtmlTextAreaElement as TextAreaElement, InputEvent, -}; +use web_sys::{Event, HtmlElement}; use crate::Callback; pub use events::*; -/// A type representing data from `oninput` event. -#[derive(Debug)] -pub struct InputData { - /// Inserted characters. Contains value from - /// [InputEvent](https://developer.mozilla.org/en-US/docs/Web/API/InputEvent/data). - pub value: String, - /// The InputEvent received. - pub event: InputEvent, -} - -// There is no '.../Web/API/ChangeEvent/data' (for onchange) similar to -// https://developer.mozilla.org/en-US/docs/Web/API/InputEvent/data (for oninput). -// ChangeData actually contains the value of the InputElement/TextAreaElement -// after `change` event occured or contains the SelectElement (see more at the -// variant ChangeData::Select) - -/// A type representing change of value(s) of an element after committed by user -/// ([onchange event](https://developer.mozilla.org/en-US/docs/Web/Events/change)). -#[derive(Debug)] -pub enum ChangeData { - /// Value of the element in cases of ``, `