10个版本

0.6.0-alpha.22024年8月7日
0.6.0-alpha.02024年8月1日
0.5.7 2024年7月18日
0.5.1 2024年4月5日
0.4.3 2023年12月7日

#128 in WebAssembly

Download history 3403/week @ 2024-05-01 3207/week @ 2024-05-08 3658/week @ 2024-05-15 3413/week @ 2024-05-22 3485/week @ 2024-05-29 3389/week @ 2024-06-05 3482/week @ 2024-06-12 3635/week @ 2024-06-19 3169/week @ 2024-06-26 2002/week @ 2024-07-03 2250/week @ 2024-07-10 2764/week @ 2024-07-17 2459/week @ 2024-07-24 2868/week @ 2024-07-31 2865/week @ 2024-08-07 2940/week @ 2024-08-14

11,597 每月下载量
30 个包中使用 (直接使用 9 个)

MIT/Apache

520KB
10K SLoC

dioksus信号

dioksus信号是一个具有本地订阅的数据便捷运行时。

可复制数据

所有信号都实现了Copy,即使内部值没有实现Copy。这使得将任何数据移动到futures或子组件变得容易。

use dioxus::prelude::*;
use dioxus_signals::*;

#[component]
fn App() -> Element {
    let signal = use_signal(|| "hello world".to_string());

    spawn(async move {
        // signal is Copy even though String is not copy
        print!("{signal}");
    });

    rsx! {
        "{signal}"
    }
}

本地订阅

只有当你在组件中读取信号时,信号才会订阅组件。它永远不会在读取未来或事件处理程序中的数据时订阅组件。

use dioxus::prelude::*;
use dioxus_signals::*;

#[component]
fn App() -> Element {
    // Because signal is never read in this component, this component will not rerun when the signal changes
    let mut signal = use_signal(|| 0);

    rsx! {
        button {
            onclick: move |_| {
                signal += 1;
            },
            "Increase"
        }
        for id in 0..10 {
            Child {
                signal,
            }
        }
    }
}

#[derive(Props, Clone, PartialEq)]
struct ChildProps {
    signal: Signal<usize>,
}

fn Child(props: ChildProps) -> Element {
    // This component does read from the signal, so when the signal changes it will rerun
    rsx! {
        "{props.signal}"
    }
}

由于订阅是在读取(而不是创建)数据时发生的,因此您可以通过正常的上下文API提供信号

use dioxus::prelude::*;
use dioxus_signals::*;

#[component]
fn App() -> Element {
    // Because signal is never read in this component, this component will not rerun when the signal changes
    use_context_provider(|| Signal::new(0));

    rsx! {
        Child {}
    }
}

#[component]
fn Child() -> Element {
    let signal: Signal<i32> = use_context();
    // This component does read from the signal, so when the signal changes it will rerun
    rsx! {
        "{signal}"
    }
}

计算数据

除了组件中的本地订阅之外,dioksus-signals 还提供了一种推导具有本地订阅的数据的方法。

当钩子内的任何信号更改时,use_memo钩子才会重新运行

use dioxus::prelude::*;
use dioxus_signals::*;

#[component]
fn App() -> Element {
    let mut signal = use_signal(|| 0);
    let doubled = use_memo(move || signal * 2);

    rsx! {
        button {
            onclick: move |_| signal += 1,
            "Increase"
        }
        Child {
            signal: doubled
        }
    }
}

#[component]
fn Child(signal: ReadOnlySignal<usize>) -> Element {
    rsx! {
        "{signal}"
    }
}

依赖项

~2.4–8MB
~67K SLoC