Implémenter l'équivalent useSelector pour React Context ?

Il existe de nombreux articles qui montrent comment Redux peut être remplacé par du contexte et des crochets (voir celui-ci de Kent Dodds, par exemple). L'idée de base est de rendre votre état global disponible via un contexte au lieu de le mettre dans un magasin Redux. Mais il y a un gros problème avec cette approche: les composants qui s'abonnent au contexte seront restitués chaque fois qu'un changement se produit dans le contexte, que votre composant se soucie ou non de la partie de l'état qui vient de changer. Pour les composants fonctionnels, React-redux résout ce problème avec le crochet useSelector. Ma question est donc la suivante: peut-on créer un crochet comme useSelector qui saisirait un morceau du contexte au lieu du magasin Redux, aurait la même signature que useSelector et, tout comme useSelector, ne provoquerait des rendus au composant que lorsque le " sélectionné" une partie du contexte a changé ?

(note : cette discussion sur la page React Github suggère que cela ne peut pas être fait)


Solution du problème

Non, ce n'est pas possible. Chaque fois que vous mettez une nouvelle valeur de contexte dans un fournisseur, tous les consommateurs seront restitués, même s'ils n'ont besoin que d'une partie de cette valeur de contexte.

C'est précisément l'une des raisons pour lesquelles nous avons renoncé à utiliser le contexte pour propager les mises à jour d'état dans React-Redux v6, et sommes revenus à l'utilisation des abonnements directs au magasin dans la v7.

Il existe une RFC React écrite par la communauté pour ajouter des sélecteurs à context, mais rien n'indique que l'équipe React poursuivra réellement la mise en œuvre de cette RFC.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"