description: Component could mutate internal state or re-render based on events emitted by html or Yew components
Listen to events and mutate state
The framework provide the capability to update the internal state, for example, when an event is emitted by a child component.
The update
method could be called and mutate the internal state. The update
method is called via self.link.callback
, link
being an attribute of the component struct.
The update
method receives "context" by the argument msg
of type Self::Message
. You can define any type for Message
. The common way is to define an enum Msg
for any action that can mutate the state. Then define Msg
as the type of Message
in the Component trait implementation.
You can decide to render the component returning true
from the Update
method.
#![allow(unused_variables)] fn main() { use yew::prelude::*; pub struct ListenEventComponent { link: ComponentLink<Self>, name: String, show_message: bool, } pub enum Msg { Click, } impl Component for ListenEventComponent { type Message = Msg; type Properties = (); fn create(_props: Self::Properties, link: ComponentLink<Self>) -> Self { Self { link, name: "Clark".into(), show_message: false, } } fn update(&mut self, msg: Self::Message) -> ShouldRender { match msg { Msg::Click => self.show_message = true, } true } fn change(&mut self, _props: Self::Properties) -> ShouldRender { true } fn view(&self) -> Html { if !self.show_message { html! { <> <button onclick=self.link.callback( |_| Msg::Click )>{"Click here!"}</button> </> } } else { html! { <> <h1>{format!("Hello {}", self.name)}</h1> </> } } } } }
Define the link
attribute in the state
#![allow(unused_variables)] fn main() { // ... pub struct ListenEventComponent { link: ComponentLink<Self>, // ... }
Define a Message enum
#![allow(unused_variables)] fn main() { // ... pub enum Msg { Click, } impl Component for ListenEventComponent { type Message = Msg; type Properties = (); // ... }
Update the internal state based on the context
#![allow(unused_variables)] fn main() { // ... fn update(&mut self, msg: Self::Message) -> ShouldRender { match msg { Msg::Click => self.show_message = true, } true } // ... }
Register to the html events
#![allow(unused_variables)] fn main() { // ... html! { <button onclick=self.link.callback( |_| Msg::Click)>{"Click here!"}</button> // ... }