79 个版本

0.7.0-preview22024 年 4 月 29 日
0.6.14 2024 年 8 月 14 日
0.6.13 2024 年 7 月 24 日
0.6.9 2024 年 3 月 4 日
0.0.19 2022 年 11 月 27 日

1609网页编程

Download history 8178/week @ 2024-05-03 8538/week @ 2024-05-10 8502/week @ 2024-05-17 9112/week @ 2024-05-24 10643/week @ 2024-05-31 7643/week @ 2024-06-07 8344/week @ 2024-06-14 9267/week @ 2024-06-21 6267/week @ 2024-06-28 5678/week @ 2024-07-05 10109/week @ 2024-07-12 11287/week @ 2024-07-19 12326/week @ 2024-07-26 11703/week @ 2024-08-02 11536/week @ 2024-08-09 11138/week @ 2024-08-16

每月下载 48,910
169 个包中使用了 (直接使用 11 个)

MIT 许可证

405KB
8K SLoC

Leptos 网页框架的响应式系统。

精细级联响应式

Leptos 建立在精细级联响应式系统之上,这意味着单个响应式值(“信号”,有时也称为可观察对象)会触发与之对应的代码(“效果”,有时也称为观察者)重新运行。响应式系统的这两部分是相互依赖的。没有效果,信号可以在响应式系统中变化,但永远不会以与外部世界交互的方式被观察到。没有信号,效果运行一次后就不会再运行,因为没有可观察的值可以订阅。

以下是在构建响应式系统时需要用到的最常用的函数和类型:

信号

  1. 信号: create_signal,它返回一个 (ReadSignal, WriteSignal 元组,或 create_rw_signal,它返回一个不带这种读写分离的信号 RwSignal
  2. 派生信号:任何依赖于其他信号的函数。
  3. 记忆化: create_memo,它返回一个 Memo
  4. 资源: create_resource,将一个 async Future 转换为同步的 Resource 信号。
  5. 触发器: create_trigger 创建了一个没有任何关联状态的纯反应式 Trigger 原语。

效果

  1. 当您需要将反应式系统与外部事物同步时(例如:将日志记录到控制台、写入文件或本地存储),请使用 create_effect
  2. Leptos DOM 渲染器将模板中的任何 [Fn] 包装在 create_effect 中,因此您编写的组件不需要显式效果来与 DOM 同步。

示例

use leptos_reactive::*;

// creates a new reactive runtime
// this is omitted from most of the examples in the docs
// you usually won't need to call it yourself
let runtime = create_runtime();
// a signal: returns a (getter, setter) pair
let (count, set_count) = create_signal(0);

// calling the getter gets the value
// can be `count()` on nightly
assert_eq!(count.get(), 0);
// calling the setter sets the value
// can be `set_count(1)` on nightly
set_count.set(1);
// or we can mutate it in place with update()
set_count.update(|n| *n += 1);

// a derived signal: a plain closure that relies on the signal
// the closure will run whenever we *access* double_count()
let double_count = move || count.get() * 2;
assert_eq!(double_count(), 4);

// a memo: subscribes to the signal
// the closure will run only when count changes
let memoized_triple_count = create_memo(move |_| count.get() * 3);
// can be `memoized_triple_count()` on nightly
assert_eq!(memoized_triple_count.get(), 6);

// this effect will run whenever `count` changes
create_effect(move |_| {
    println!("Count = {}", count.get());
});

// disposes of the reactive runtime
runtime.dispose();

依赖项

~3.5–9MB
~160K SLoC