3个不稳定版本
0.2.1 | 2023年1月17日 |
---|---|
0.2.0 | 2023年1月16日 |
0.1.0 | 2023年1月13日 |
101 在 #callback
每月62次下载
在 yewprint 中使用
22KB
283 行
yew-callbacks
另一个没人要求的crate。
此crate提供了一个衍射宏Callbacks
,可以在Yew枚举消息上使用,以帮助管理回调。
但是为什么
Yew组件中的回调易于创建但难以管理。为了避免重复,您应该在组件的create()
方法中预先创建它们,将它们存储在组件的状态中,然后将克隆传递给子组件。不幸的是,这会创建很多冗余。
为了解决这个问题,yew-callbacks
提供了一个宏,它将自动为您的回调创建某种缓存。您只需在组件的create()
方法中创建一次这个缓存,然后您就可以使用这些方法轻松地获取您的回调。
示例
use yew::prelude::*;
use yew_callbacks::Callbacks;
#[derive(Debug, Callbacks)]
enum Msg {
OnClick(MouseEvent),
}
#[derive(Debug)]
struct App {
cb: MsgCallbacks<Self>,
}
impl Component for App {
type Message = Msg;
type Properties = ();
fn create(ctx: &Context<Self>) -> Self {
Self {
cb: ctx.link().into(),
}
}
fn view(&self, ctx: &Context<Self>) -> Html {
html! {
<button onclick={self.cb.on_click()}>
{ "Hello World!" }
</button>
}
}
}
为什么关心
不是性能。
如果您的子组件的属性发生变化,则子组件将被更新。如果您执行onclick={ctx.link().callback(Msg::OnClick)
,则子组件会认为每次父组件更新时都有更新。这是因为每次执行ctx.link().callback(Msg::OnClick)
都会创建一个新的回调。
处理多个子组件
此crate还允许对回调的参数进行柯里化。
示例
use yew::prelude::*;
use yew_callbacks::Callbacks;
#[derive(Debug, Callbacks)]
enum Msg {
OnClick(#[curry] usize, MouseEvent),
}
#[derive(Debug)]
struct App {
games: Vec<AttrValue>,
cb: MsgCallbacks<Self>,
}
impl Component for App {
type Message = Msg;
type Properties = ();
fn create(ctx: &Context<Self>) -> Self {
Self {
games: vec![
"Freedom Planet 2".into(),
"Asterigos: Curse of the Stars".into(),
"Fran Bow".into(),
"Cats in Time".into(),
"Ittle Dew 2+".into(),
"Inscryption".into(),
],
cb: ctx.link().into(),
}
}
fn view(&self, _ctx: &Context<Self>) -> Html {
self
.games
.iter()
.enumerate()
.map(|(i, game)| html! {
<button onclick={self.cb.on_click(i)}>
{ format!("You should try {game}") }
</button>
})
.collect()
}
}
依赖关系
~0–380KB