Skip to content

createSignal

最小限のシグナルです。[読み取り, 書き込み] を返し、必要なら共有の subscribers バスへ知らせを流せるので、関係のないモジュールでも変化に反応できます。

API

createSignal(value, options?)

パラメーター

パラメーター説明既定値
value最初の値T必須
options.subscriberイベント名。変化したときに subscribers へ知らせますstringundefined
options.equals「変わったかどうか」をどう決めるかboolean | ((prev: T, next: T) => boolean)true

equals の意味:

ふるまい
省略、または trueObject.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 });

補足

  1. 既定では参照の同一性で見ます。 中身が同じでも新しく作り直したオブジェクトは、変化とみなされ ます。これはシグナルの標準的なふるまいであり、書き込みを O(1) に保ちます。
  2. 深い比較は自分で選ぶものです。 { equals: isEqual } と書けば使えるので、その負荷が呼び出し側から見えます。
  3. subscriber は任意です。 付けなければ、シグナルはただのローカルな状態になります。

0.3 で変わりました

ふるまいが変わる修正がふたつあります。

  • { equals: true } はかつて「つねに等しい」という意味で、シグナルを凍りつかせて 一度も更新されない ようにしていました。いまは undefined と同じく「既定の比較を使う」という意味です。
  • かつては書き込みのたびに、equals に加えて cloneDeepisEqual まで走っていました。これは書き込みという頻繁な経路にデータ量ぶんの複製を置くもので、しかもその余分な深い比較が equals を上書きしていたので、{ equals: false }(「つねに知らせる」)は中身が同じ値に対して黙って何もしませんでした。どちらもなくなりました。

MIT ライセンスのもとで公開されています。