Réagir avec Redux? Qu'en est-il du problème du «contexte»?

88

Je poste normalement des trucs liés au code sur Stack, mais c'est plus une question sur ce que sont les pensées générales de la communauté.

Il semble y avoir beaucoup de gens qui préconisent l'utilisation de Redux avec React pour gérer les données / l'état, mais en lisant et en apprenant les deux, je suis tombé sur quelque chose qui ne semble pas tout à fait correct.

Redux

Au bas de cette page: http://redux.js.org/docs/basics/UsageWithReact.html (Passing the Store) il recommande d'utiliser le "Magic" de React 'Context'.

Une option serait de le transmettre comme accessoire à chaque composant du conteneur. Cependant, cela devient fastidieux, car vous devez câbler le stockage même via des composants de présentation simplement parce qu'ils rendent un conteneur au plus profond de l'arborescence des composants.

L'option que nous recommandons est d'utiliser un composant React Redux spécial appelé pour rendre le magasin disponible par magie à tous les composants du conteneur ...

Réagir

Sur la page React Context ( https://facebook.github.io/react/docs/context.html ), il y a un avertissement en haut:

Le contexte est une fonctionnalité avancée et expérimentale. L'API est susceptible de changer dans les prochaines versions.

Puis en bas:

Tout comme les variables globales sont mieux évitées lors de l'écriture de code clair, vous devez éviter d'utiliser le contexte dans la plupart des cas ...

N'utilisez pas de contexte pour transmettre vos données de modèle à travers les composants. Enfiler explicitement vos données dans l'arbre est beaucoup plus facile à comprendre ...

Alors...

Redux recommande d'utiliser la fonction React 'Context' plutôt que de transmettre le storelong à chaque composant via 'props'. Alors que React recommande le contraire.

Aussi, il semble que Dan Abramov (le créateur de Redux) travaille désormais pour Facebook (le créateur de React), histoire de me dérouter davantage.

  • Est-ce que je lis tout cela correctement ..?
  • Quel est le consensus général actuel sur cette question…?
Stephen Last
la source
8
Ahh c'est une excellente question, je suis très curieux d'entendre les points de vue des autres aussi! J'ai un peu peur qu'il se ferme en raison de l'aspect discussion. J'espère vraiment que non.
mjohnsonengr

Réponses:

88

Le contexte est une fonctionnalité avancée et est susceptible de changer. Dans certains cas, ses avantages l'emportent sur ses inconvénients, de sorte que certaines bibliothèques comme React Redux et React Router choisissent de s'en remettre malgré la nature expérimentale.

La partie importante ici est le mot bibliothèques . Si le contexte change son comportement, nous, en tant qu'auteurs de bibliothèques , devons nous ajuster . Cependant, tant que la bibliothèque ne vous demande pas d'utiliser directement l'API contextuelle, vous, en tant qu'utilisateur, ne devriez pas avoir à vous soucier de ses modifications.

React Redux utilise le contexte en interne, mais il n'expose pas ce fait dans l'API publique. Vous devriez donc vous sentir beaucoup plus en sécurité en utilisant le contexte via React Redux que directement car si cela change, le fardeau de la mise à jour du code sera sur React Redux et non sur vous.

En fin de compte, React Redux prend toujours en charge le fait de toujours passer store comme accessoire, donc si vous voulez éviter complètement le contexte, vous avez ce choix. Cependant, je dirais que ce n'est pas pratique.

TLDR: évitez d'utiliser directement le contexte à moins que vous ne sachiez vraiment ce que vous faites. L'utilisation d'une bibliothèque qui s'appuie sur le contexte en interne est relativement sûre.

Dan Abramov
la source
1
Bien dit Dan. Le risque est que si React supprime complètement le contexte dans une version future, il faudrait probablement retravailler pour mettre à jour toute application Redux existante. Il est peu probable que Redux soit en mesure de protéger les utilisateurs d'un tel changement. Étant donné que vous êtes maintenant avec Facebook, la bonne nouvelle est que j'espère que vous serez suffisamment averti si le contexte disparaît un jour.
Cory House le
6
React ne supprimera pas le contexte. Je veux dire, c'est techniquement possible, mais la raison pour laquelle cela existe est que de nombreux produits à l'intérieur de FB en avaient besoin. Donc, à moins qu'il n'y ait une solution équivalente, cela ne disparaîtra pas. Mais son API exacte peut changer, ce dont nous protégeons les utilisateurs.
Dan Abramov
5
Une autre note importante est que React prévoit d'utiliser le contexte plus plutôt que moins à l'avenir. Nous pensons que cela pourrait s'avérer utile pour le style, les animations, la gestion des gestes, etc.
Dan Abramov
Il est intéressant de noter cependant que lorsque vous obtenez des bibliothèques de composants React (par exemple Material-ui), ils ne feront naturellement pas partie du modèle d'état de votre application, mais sont toujours un arbre de composants React, avec les mêmes exigences que maintenir leur propre modèle d'état et flux de données séparés de l'application «principale». Ils utilisent donc la fonction contextuelle comme le seul moyen (pour eux) de transmettre des données à leur enfant.
stephenwil
1
@DanAbramov qu'en est-il de la nouvelle API de contexte? N'est-il toujours pas recommandé d'utiliser?
Stanislav Mayorov
4

Je ne sais pas pour les autres, mais je préfère utiliser le décorateur de connexion de react-redux pour envelopper mes composants de sorte que seuls les accessoires du magasin dont j'ai besoin soient passés dans mon composant. Cela justifie l'utilisation du contexte dans un sens parce que je ne le consomme pas (et je sais, en règle générale, aucun code dont je suis en charge ne le consommera pas).

Lorsque je teste mes composants, je teste le composant non encapsulé. Parce que react-redux n'a passé que les accessoires dont j'avais besoin sur ce composant, je sais maintenant exactement de quels accessoires j'ai besoin lorsque j'écris les tests.

Je suppose que le fait est que je ne vois jamais le mot context dans mon code, je ne le consomme pas, donc dans une certaine mesure, cela ne m'affecte pas! Cela ne dit rien sur l'avertissement "expérimental" de Facebook. Si le contexte disparaissait, je serais aussi foutu que tout le monde jusqu'à ce que Redux soit mis à jour.

mjohnsonengr
la source
Intéressant ... Je vois ce que vous voulez dire à propos de «react-redux» en utilisant Provideret connectpour faire abstraction de tout le contexte. Je suppose qu'avec Dan Abramov maintenant chez FB, vous espérez que si le contexte changeait, Redux et 'react-redux' seraient mis à jour ... Mais aucune garantie cependant, et l'avertissement "expérimental" de FB est toujours là pour que tout le monde puisse le voir.
Stephen le
J'espère certainement que si FB ne garde pas react-redux dans la boucle au cas où quelque chose arriverait au contexte, un contributeur open source quelque part plus familier que moi avec redux; sinon, je vais le découvrir et le faire moi-même!
mjohnsonengr
J'ai demandé à Dan ce qu'il pensait via Twitter ... Bonne réponse, dans le même sens ... Utilisez la bibliothèque qui utilise Context, ne l'utilisez pas directement.
Stephen le
1

Il existe un module npm qui facilite l'ajout de redux au contexte de réaction

https://github.com/jamrizzi/redux-context-provider

https://www.npmjs.com/package/redux-context-provider

import React, { Component } from 'react';
import ReduxContextProvider from 'redux-context-provider';
import createStore from './createStore';
import actions from './actions';
import Routes from './routes';

export default class App extends Component {
  render() {
    return (
      <ReduxContextProvider store={store} actions={actions}>
        <Routes />
      </ReduxContextProvider>
    );
  }
}
Confiture Risser
la source