Skip to content

createSignal

Una señal mínima: [leer, escribir], con difusión opcional por el bus compartido subscribers, para que módulos sin relación entre sí puedan reaccionar a un cambio.

API

createSignal(value, options?)

Parámetros

ParámetroDescripciónTipoPor defecto
valueValor inicialTObligatorio
options.subscriberNombre del evento; al cambiar, avisa por subscribersstringundefined
options.equalsCómo se decide si «ha cambiado»boolean | ((prev: T, next: T) => boolean)true

Qué significa equals:

ValorComportamiento
omitido o trueObject.is: igualdad de referencia o de valor (lo habitual en las señales)
falseCada escritura cuenta como cambio y avisa
una funciónDevolver true significa «son iguales, no avises»

Devuelve

[getter, setter].

Ejemplo

js
import { createSignal, isEqual, subscribers } from 'ranuts';

const [count, setCount] = createSignal(0, { subscriber: 'count-changed' });
subscribers.tap('count-changed', () => render(count()));

setCount(1); // avisa
setCount(1); // mismo valor: no avisa

// Pide la comparación profunda solo cuando de verdad haga falta
const [tree, setTree] = createSignal(initial, { equals: isEqual });

Notas

  1. Por defecto, igualdad de referencia. Un objeto recién construido pero idéntico por dentro es un cambio. Así se comportan las señales de siempre, y así la escritura se mantiene en O(1).
  2. La comparación profunda hay que pedirla con { equals: isEqual }, de modo que su coste se vea en el punto de llamada.
  3. subscriber es opcional. Sin él, la señal es puro estado local.

Cambiado en la 0.3

Dos correcciones que cambian el comportamiento:

  • { equals: true } significaba «siempre iguales», lo que congelaba la señal y hacía que nunca se actualizara. Ahora significa «usa la comparación por defecto», igual que undefined.
  • Cada escritura ejecutaba cloneDeep e isEqual por encima de equals. Eso ponía una copia proporcional al tamaño de los datos en el camino caliente de la escritura, y esa comprobación profunda de más anulaba a equals, así que { equals: false } («avisa siempre») no hacía nada con valores idénticos por dentro. Se han quitado las dos.

Publicado bajo la licencia MIT.