#callback #yew #cache

yew-callbacks

创建和管理组件的回调,无需创建重复项

3个不稳定版本

0.2.1 2023年1月17日
0.2.0 2023年1月16日
0.1.0 2023年1月13日

101#callback

Download history 135/week @ 2024-04-01 22/week @ 2024-04-08 37/week @ 2024-04-15 21/week @ 2024-04-22 138/week @ 2024-04-29 37/week @ 2024-05-06 25/week @ 2024-05-13 26/week @ 2024-05-20 39/week @ 2024-05-27 18/week @ 2024-06-03 21/week @ 2024-06-10 39/week @ 2024-06-17 15/week @ 2024-06-24 24/week @ 2024-07-01 8/week @ 2024-07-08 12/week @ 2024-07-15

每月62次下载
yewprint 中使用

MIT/Apache

22KB
283

Rust Latest Version Rust 1.60+ License Docs.rs LOC Dependency Status

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