createSignal
最小限のシグナルです。[読み取り, 書き込み] を返し、必要なら共有の subscribers バスへ知らせを流せるので、関係のないモジュールでも変化に反応できます。
API
createSignal(value, options?)
パラメーター
| パラメーター | 説明 | 型 | 既定値 |
|---|---|---|---|
value | 最初の値 | T | 必須 |
options.subscriber | イベント名。変化したときに subscribers へ知らせます | string | undefined |
options.equals | 「変わったかどうか」をどう決めるか | boolean | ((prev: T, next: T) => boolean) | true |
equals の意味:
| 値 | ふるまい |
|---|---|
省略、または true | Object.is。参照や値としての同一性(シグナルの標準的なふるまい) |
false | 書き込むたびに変化とみなし、知らせます |
| 関数 | true を返すと「等しいので知らせは省く」という意味になります |
戻り値
[getter, setter].
使用例
js
import { createSignal, isEqual, subscribers } from 'ranuts';
const [count, setCount] = createSignal(0, { subscriber: 'count-changed' });
subscribers.tap('count-changed', () => render(count()));
setCount(1); // 知らせが飛びます
setCount(1); // 同じ値なので知らせません
// 本当に必要なときだけ、深い比較を選びます
const [tree, setTree] = createSignal(initial, { equals: isEqual });補足
- 既定では参照の同一性で見ます。 中身が同じでも新しく作り直したオブジェクトは、変化とみなされ ます。これはシグナルの標準的なふるまいであり、書き込みを O(1) に保ちます。
- 深い比較は自分で選ぶものです。
{ equals: isEqual }と書けば使えるので、その負荷が呼び出し側から見えます。 subscriberは任意です。 付けなければ、シグナルはただのローカルな状態になります。
0.3 で変わりました
ふるまいが変わる修正がふたつあります。
{ equals: true }はかつて「つねに等しい」という意味で、シグナルを凍りつかせて 一度も更新されない ようにしていました。いまはundefinedと同じく「既定の比較を使う」という意味です。- かつては書き込みのたびに、
equalsに加えてcloneDeepとisEqualまで走っていました。これは書き込みという頻繁な経路にデータ量ぶんの複製を置くもので、しかもその余分な深い比較がequalsを上書きしていたので、{ equals: false }(「つねに知らせる」)は中身が同じ値に対して黙って何もしませんでした。どちらもなくなりました。