#信号 #响应式 #frp

futures-signals-component-macro

创建与 futures-signals 兼容组件的宏

2个版本

0.1.1 2024年7月5日
0.1.0 2024年6月30日

GUI中排名321

Download history 105/week @ 2024-06-24 153/week @ 2024-07-01 38/week @ 2024-07-08 708/week @ 2024-07-15 1212/week @ 2024-07-22 1227/week @ 2024-07-29 216/week @ 2024-08-05

每月下载量3,373

MIT许可协议

36KB
697

futures-signals-component-macros

此Crate提供基于futures-signals的实用宏,其目的是生成灵活的宏式组件,这些组件既可以与信号属性一起使用,也可以与非信号属性一起使用,同时不会因类型复杂度过高而使组件实现过载。

以下是一个创建组件的示例(在这种情况下输出是一个DOMINATOR Dom节点,但它可以是任何Rust类型)

#[component(render_fn = some_button)]
pub struct SomeButton<T: ToString + Default = i32, U: ToI32 + ToString + Default = i32> {
    /// The button label. This can be a signal, which allows us to update the label dynamically based on state changes
    /// The macro also generates a setter for a non-signal setter, in case we just want to assign a static value to the property
    #[signal]
    pub label: String,
    
    #[signal]
    pub foo: T,

    #[signal]
    pub bar: U,

    #[signal_vec]
    #[default(vec![123])]
    pub some_generic_signal_vec: i32,
}

pub fn some_button(props: impl SomeButtonPropsTrait + 'static) -> Dom {
    let SomeButtonProps { label, .. } = props.take();

    html!("div", {
        .apply_if(label.is_some(), |b| {
            b.text_signal(label.unwrap())
        })
    })
}

要使用此组件,您可以像这样使用生成的some_button!

fn my_app(label: impl Signal<Item=String> + 'static) -> Dom {
    some_button!({
        .label_signal(label)
        .foo(42)
    })
}

开发和测试

要本地运行测试,您需要在系统上安装一些依赖项。

首先,您需要Rust。按照https://rustup.rs/上针对您系统的说明进行安装

您还需要wasm32-unknown-unknown目标

rustup target add wasm32-unknown-unknown

最后,您需要wasm-bindgen-cli工具才能运行浏览器中的测试

cargo install wasm-bindgen-cli

现在您可以使用以下命令运行测试

cargo test & 
cargo test --target wasm32-unknown-unknown

依赖项

~0.8–3.5MB
~70K SLoC