mcpField
S
signals-preact-dart

signals-preact-dart

github.com/rodydavis开发82475 次安装12 周前更新
代码仓库

关于 signals-preact-dart

面向使用信号管理应用状态的 Dart 开发者,介绍 `preact_signals` 的响应式编程。内容涵盖核心原语、依赖跟踪、批处理及避免循环的规则。

主要功能

  1. 01可变信号与只读信号
  2. 02惰性、记忆化的计算值
  3. 03动态跟踪依赖的副作用
  4. 04批处理多次状态写入
  5. 05依赖循环与重入规则指南

适用场景

  1. 01建模响应式应用状态
  2. 02从多个信号派生数值
  3. 03在跟踪的状态变化时运行副作用
  4. 04将状态更新合并为一次批处理

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rodydavis/signals.dart --skill signals-preact-dart

安装后在 Claude Code 中输入/signals-preact-dart确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

CONTEXT.md
core/
batch.md
computed.md
CONTEXT.md
effect.md
readonly.md
signal.md

详细介绍

Dart 中的 Preact Signals

本技能介绍 preact_signals 包的核心响应式编程原语和实现模式。

相关文档与条目

相关文件描述
signal.md标准的可写响应式状态原语,包含值访问器、变更机制和基本自定义选项。
computed.md惰性、记忆化的只读派生状态信号,可动态跟踪响应式依赖。
effect.md同步观察器,用于管理活动订阅循环、动态依赖更新和生命周期拆除。
readonly.md只读信号视图,确保数据访问流向单一。
batch.md事务式状态变更块,可优化响应式计算并避免渲染/重新计算的频繁触发。

核心原语快速入门指南

signals 库提供五个核心函数,它们是构建任意响应式业务逻辑的基础。

1. signal(initialValue)

创建一个新的可变信号容器。读取信号的值或订阅更新,只需访问 .value。

final counter = signal(0);
print(counter.value); // 0
counter.value = 1; // Mutates value and schedules dependent updates
.peek()

读取信号当前的值,但不会订阅其变更。

final counter = signal(0);
final logCount = signal(0);

effect(() {
  print(counter.value);
  // Read using peek to avoid subscribing/triggering loop
  logCount.value = logCount.peek() + 1;
});
2. untracked(fn)

执行一个回调,该回调读取信号但不会订阅其中任何信号。

final counter = signal(0);
final count = signal(0);

effect(() {
  print(counter.value);
  count.value = untracked(() => count.value + 1);
});
3. computed(fn)

将多个信号的值组合成一个惰性、记忆化的派生信号。

final first = signal('John');
final last = signal('Doe');
final fullName = computed(() => '${first.value} ${last.value}');
print(fullName.value); // John Doe
4. effect(fn)

通过运行回调并订阅其中读取的所有信号,协调即时同步副作用。

final name = signal('Jane');
final dispose = effect(() => print('Hello $name'));
dispose(); // Clean up subscription
5. batch(fn)

将多次信号写入合并为一个事务,并在事务结束时恰好执行一次所有依赖的计算和 effect。

final a = signal(0);
final b = signal(0);

batch(() {
  a.value = 1;
  b.value = 2;
});

1. 核心原语详解

A. Signal<T>

一种表示可观察的可变值的状态原语。

final count = signal(0);
count.value = 1; // Notifies all active subscribers/effects
B. Computed<T>

一种派生状态原语,表示根据其他信号计算得出的只读值。它具有以下特性:

  • 惰性:仅在访问时计算。
  • 记忆化:缓存其值,仅在源依赖项发生变化时重新计算。
final count = signal(2);
final double = computed(() => count.value * 2);
C. Effect

一种观察器,会立即执行回调并跟踪读取的信号。每当任何已跟踪的信号发生变化时,它都会重新运行。

final dispose = effect(() {
  print('Current count: ${count.value}');
});
dispose(); // Clean up subscription

2. 依赖跟踪与重入规则

  • 同步上下文:根据回调执行期间读取的信号,动态跟踪依赖项。
  • 循环检测:在 computed 信号自身的执行流程中读取该信号,或在 computed 回调中设置依赖项,都会导致循环。避免在 computed getter 中产生副作用。
  • 惰性初始值:创建惰性 computed 信号时不会对其求值。在观察器中强制调用 .peek() 前,务必先调用 isInitialized 或检查初始化状态,以避免因重入循环而崩溃。

评论

支持 Markdown