État applicatif avec NgRx SignalStore
signal() perdu au fond d'un composant. Dès qu'un état est partagé, dérivé et muté depuis plusieurs endroits, on veut une frontière claire : des sélecteurs en lecture seule, des méthodes pour le faire évoluer. NgRx SignalStore ( @ngrx/signals ) offre exactement ça, sans le boilerplate des actions/reducers du NgRx classique.
Anatomie d'un signalStore
withState déclare l'état initial, withComputed les valeurs dérivées, withMethods les opérations. Chaque champ d'état devient automatiquement un signal exposé sur l'instance.
patchState , qui applique une mise à jour immuable et notifie les signals concernés.
Des sélecteurs qui sont des signals
store.total et store.count ne sont pas des fonctions à appeler dans le service : ce sont des computed , donc des signals à part entière. Dans un composant, on les lit comme n'importe quel signal, et le change detection zoneless ne re-rend que ce qui en dépend.
Composer avec des appels async
withMethods peut intégrer rxMethod (depuis @ngrx/signals/rxjs-interop ) pour brancher un flux RxJS, ou simplement async / await pour un fetch . On garde la logique d'orchestration dans le store, le composant reste une vue. C'est aussi là qu'on pose un état loading pour un pattern stale-while-revalidate.
Store ou simple signal ?
signal() privé : un store y ajouterait de l'indirection inutile. Le SignalStore se justifie quand l'état est :
- ›
partagé entre plusieurs composants ou routes ; - ›
dérivé par plusieurs computedqu'on veut centraliser ; - ›
muté par des opérations qu'on veut tester en isolation.
Le SignalStore n'est pas le NgRx « actions partout » d'hier. C'est une façade de signals : lecture seule en sortie, méthodes en entrée, zéro reducer. Tu gardes la discipline d'un store sans payer son cérémonial.