8 个重大版本发布

0.9.0 2023 年 10 月 15 日
0.7.0 2023 年 6 月 30 日
0.6.1 2023 年 1 月 27 日
0.6.0 2022 年 12 月 10 日
0.1.3 2021 年 12 月 12 日

#123 in WebAssembly

Download history 87/week @ 2024-03-13 66/week @ 2024-03-20 96/week @ 2024-03-27 120/week @ 2024-04-03 86/week @ 2024-04-10 113/week @ 2024-04-17 93/week @ 2024-04-24 47/week @ 2024-05-01 47/week @ 2024-05-08 40/week @ 2024-05-15 58/week @ 2024-05-22 60/week @ 2024-05-29 71/week @ 2024-06-05 51/week @ 2024-06-12 155/week @ 2024-06-19 77/week @ 2024-06-26

368 每月下载量
用于 10 个组件 (6 个直接使用)

MIT/Apache

160KB
3.5K SLoC

Bounce

Run Tests & Publishing crates.io docs.rs

Bounce 是为 Yew 提供的无缝状态管理库。

Bounce 受 ReduxRecoil 启发。

原理

目前可用的 Yew 状态管理解决方案都存在一些(或全部)以下局限性

  • 过于冗长。

    用户必须手动控制是否通知订阅者或手动定义上下文。

  • 状态更改通知所有人。

    状态更改将通知所有订阅者。

  • 不必要的克隆。

    每次有更改时,都会为所有订阅者产生状态的克隆。

Bounce 希望成为一个状态管理库,

  • 具有最少的冗余。

    通过 PartialEq 自动检测更改。

  • 只通知相关订阅者。

    当状态更改时,只有订阅该状态的钩子将被通知。

  • 减少克隆。

    状态是 Rc

示例

为了使 bounce 状态正常工作,必须注册一个 <BounceRoot />

#[function_component(App)]
fn app() -> Html {
    html! {
        <BounceRoot>
            {children}
        </BounceRoot>
    }
}

简单状态称为 Atom

您可以派生任何实现 PartialEqDefault 的结构的 Atom

#[derive(PartialEq, Atom)]
struct Username {
    inner: String,
}

impl Default for Username {
    fn default() -> Self {
        Self {
            inner: "Jane Doe".into(),
        }
    }
}

然后您可以使用 use_atom 钩子使用它。

当第一次使用 Atom 时,它将使用其 Default 值进行初始化。

#[function_component(Setter)]
fn setter() -> Html {
    let username = use_atom::<Username>();

    let on_text_input = {
        let username = username.clone();

        Callback::from(move |e: InputEvent| {
            let input: HtmlInputElement = e.target_unchecked_into();

            username.set(Username { inner: input.value().into() });
        })
    };

    html! {
        <div>
            <input type="text" oninput={on_text_input} value={username.inner.to_string()} />
        </div>
    }
}

如果您希望创建只读(或只写)句柄,可以使用 use_atom_value(或 use_atom_setter)。

#[function_component(Reader)]
fn reader() -> Html {
    let username = use_atom_value::<Username>();

    html! { <div>{"Hello, "}{&username.inner}</div> }
}

您可以在 这里 找到完整的示例。

许可证

Bounce 同时受 MIT 许可证和 Apache 许可证(版本 2.0)的约束。

依赖项

~10–15MB
~262K SLoC