createSignal
Ein Signal in seiner knappsten Form: [lesen, schreiben], auf Wunsch mit einer Meldung über den gemeinsamen Bus subscribers, sodass auch fremde Module auf eine Änderung reagieren können.
API
createSignal(value, options?)
Parameter
| Parameter | Beschreibung | Typ | Standard |
|---|---|---|---|
value | Anfangswert | T | Erforderlich |
options.subscriber | Name des Ereignisses; meldet Änderungen über subscribers | string | undefined |
options.equals | Wie entschieden wird, ob sich etwas geändert hat | boolean | ((prev: T, next: T) => boolean) | true |
Was equals bedeutet:
| Wert | Verhalten |
|---|---|
weggelassen / true | Object.is: Gleichheit nach Referenz oder Wert (das übliche Verhalten von Signalen) |
false | Jedes Schreiben gilt als Änderung und meldet |
| eine Funktion | true heißt „gleich, keine Meldung“ |
Rückgabe
[getter, setter].
Beispiel
js
import { createSignal, isEqual, subscribers } from 'ranuts';
const [count, setCount] = createSignal(0, { subscriber: 'count-changed' });
subscribers.tap('count-changed', () => render(count()));
setCount(1); // meldet
setCount(1); // gleicher Wert — keine Meldung
// Den tiefen Vergleich nur dann anfordern, wenn du ihn wirklich brauchst
const [tree, setTree] = createSignal(initial, { equals: isEqual });Hinweise
- Standardmäßig zählt die Referenz. Ein neu gebautes, innen aber gleiches Objekt ist eine Änderung. Das entspricht dem üblichen Verhalten von Signalen und hält das Schreiben bei O(1).
- Den tiefen Vergleich musst du anfordern, über
{ equals: isEqual }— so ist sein Preis an der Aufrufstelle zu sehen. subscriberist freiwillig. Ohne ihn ist das Signal einfach lokaler Zustand.
In 0.3 geändert
Zwei Korrekturen, die das Verhalten ändern:
{ equals: true }hieß früher „immer gleich“ und fror das Signal ein, sodass es sich nie aktualisierte. Jetzt heißt es „nimm den Standardvergleich“, genau wieundefined.- Bei jedem Schreiben liefen früher zusätzlich zu
equalsnochcloneDeepundisEqual. Das legte eine Kopie in der Größe der Daten auf den heißen Pfad des Schreibens, und die zusätzliche tiefe Prüfung überstimmteequals, sodass{ equals: false }(„immer melden“) bei innen gleichen Werten stillschweigend nichts tat. Beides ist weg.