Un des problèmes que l'on rencontre rapidement lorsque l'on crée une application React est le partage d'un état entre plusieurs composants qui n'ont pas un parent proche. Pour éviter de faire du props drilling il est possible d'utiliser les contextes mais leur utilisation peut rapidement s'avérer complexe. Zustand offre une solution alternative de gestion d'état partagé avec une approche plus simple.
Pour créer un store (état partagé), on va utiliser la méthode create
Ce store peut ensuite être utilisé dans un composant à l'aide du hook généré par la fonction create.
Il est aussi possible de définir un sélecteur pour extraire un élément spécifique de notre store.
Le sélecteur permet de ne récupérer qu'une partie du store et permet aussi d'optimiser les re-rendu. En effet, le composant ne sera rendu que lorsque la valeur retourné par le sélecteur change.
Actions hors du store
Dans l'exemple ci-dessus nous avons mis les méthodes d'incrémentations / décrémentations dans l'état mais il est possible de créer les méthodes en dehors de l'état.
Cette approche permet d'avoir des méthodes globales qui peuvent être consommées par les composants sans nécessiter un hook.
Mise à jour de l'état
Lorsque l'on met à jour l'état il y a plusieurs choses que l'on peut noter :
- Les mutations doivent être immutables (même règle que pour un setState) et ne pas modifier l'objet original.
- L'objet renvoyé dans la fonction de mise à jour
setoustore.setStatesera fusionné avec l'état actuel (la fusion ne se fait pas en profondeur mais que pour les éléments de premier niveau).
Pour des modifications en profondeur, et pour éviter d'avoir trop de code à écrire, il est possible d'utiliser immer.
Middleware
Zustand dispose aussi d'un système de middleware qui permet d'ajouter de la logique lorsqu'un store est modifié. Par exemple, le middleware persist permet de stocker les informations du store en mémoire (localstorage) pour le réutiliser.
Il existe d'autres middleware comme par exemple devtool qui permet de pouvoir utiliser le redux devtool avec le store zustand.
Intégration avec TypeScript
Zustand peut être utilisé avec TypeScript mais cela nécessite quelques adaptations au niveau de la syntaxe.
L'utilisation du combine permet au type d'être inféré automatiquement pour ne pas avoir à le créer en amont.