Estado de la aplicación con NgRx SignalStore
signal() perdido en el fondo de un componente. En cuanto un estado se comparte, se deriva y se muta desde varios lugares, se quiere una frontera clara: selectores de solo lectura, métodos para hacerlo evolucionar. NgRx SignalStore ( @ngrx/signals ) ofrece exactamente eso, sin el boilerplate de las actions/reducers del NgRx clásico.
Anatomía de un signalStore
withState declara el estado inicial, withComputed los valores derivados, withMethods las operaciones. Cada campo de estado se convierte automáticamente en un signal expuesto en la instancia.
patchState , que aplica una actualización inmutable y notifica a los signals implicados.
Selectores que son signals
store.total y store.count no son funciones que se llaman en el servicio: son computed , es decir, signals de pleno derecho. En un componente, se leen como cualquier signal, y el change detection zoneless solo re-renderiza lo que depende de ellos.
Componer con llamadas async
withMethods puede integrar rxMethod (desde @ngrx/signals/rxjs-interop ) para conectar un flujo RxJS, o simplemente async / await para un fetch . Se mantiene la lógica de orquestación en el store, el componente permanece como una vista. También es aquí donde se añade un estado loading para un patrón stale-while-revalidate.
¿Store o simple signal?
signal() privado: un store añadiría indirección innecesaria. El SignalStore se justifica cuando el estado es:
- ›
compartido entre varios componentes o rutas; - ›
derivado por varios computedque se quieren centralizar; - ›
mutado por operaciones que se quieren probar en aislamiento.
El SignalStore no es el NgRx «actions en todas partes» de ayer. Es una fachada de signals: solo lectura en salida, métodos en entrada, cero reducers. Mantienes la disciplina de un store sin pagar su ceremonial.