J'essaie de comprendre la méthode de connexion de react-redux et les fonctions qu'elle prend comme paramètres. En particulier mapStateToProps()
.
D'après ce que je comprends, la valeur de retour de mapStateToProps
sera un objet dérivé de state (tel qu'il vit dans le magasin), dont les clés seront transmises à votre composant cible (le composant connect est appliqué à) comme accessoires.
Cela signifie que l'état tel qu'il est consommé par votre composant cible peut avoir une structure très différente de l'état tel qu'il est stocké dans votre magasin.
Q: est-ce OK?
Q: Est-ce prévu?
Q: Est-ce un anti-modèle?
javascript
reactjs
redux
react-redux
Pablo Barría Urenda
la source
la source
this.props.someData
plutôt quethis.props.someKey[someOtherKey].someData
... avoir du sens?Réponses:
Q:
Is this ok?
A: oui
Q:
Is this expected?
Oui, cela est prévu (si vous utilisez react-redux).
Q:
Is this an anti-pattern?
R: Non, ce n'est pas un anti-motif.
Cela s'appelle «connecter» votre composant ou «le rendre intelligent». C'est par conception.
Il vous permet de découpler votre composant de votre état un temps supplémentaire ce qui augmente la modularité de votre code. Il vous permet également de simplifier l'état de vos composants en tant que sous-ensemble de l'état de votre application, ce qui, en fait, vous aide à vous conformer au modèle Redux.
Pensez-y de cette façon: un magasin est censé contenir la totalité de l' état de votre application.
Pour les grandes applications, cela pourrait contenir des dizaines de propriétés imbriquées sur plusieurs couches en profondeur.
Vous ne voulez pas transporter tout cela à chaque appel (cher).
Sans
mapStateToProps
ou un analogue de celui-ci, vous seriez tenté de découper votre état d'une autre manière pour améliorer les performances / simplifier.la source
(1) -
un accès plus facile en profondeur(2) -
Évitez les bugs où un composant pourrait gâcher un état qui ne lui appartient pasOui c'est correct. C'est juste une fonction d'aide pour avoir un moyen plus simple d'accéder à vos propriétés d'état
Imaginez que vous avez une
posts
clé dans votre applicationstate.posts
Et composant
Posts
Par défaut
connect()(Posts)
, tous les accessoires d'état seront disponibles pour le composant connectéMaintenant, lorsque vous mappez le
state.posts
à votre composant, cela devient un peu plus agréablemapDispatchToProps
normalement vous devez écrire
dispatch(anActionCreator())
avec
bindActionCreators
vous pouvez le faire aussi plus facilement commeVous pouvez maintenant l'utiliser dans votre composant
Mise à jour sur actionCreators ..
Un exemple de actionCreator:
deletePost
Alors,
bindActionCreators
il vous suffit de prendre vos actions, de les envelopper dans l'dispatch
appel. (Je n'ai pas lu le code source de redux, mais l'implémentation pourrait ressembler à ceci:la source
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
viennent les actionsfetchPosts
et lesdeletePost
actions?state => state.posts
(lamapStateToProps
fonction) indiquera à React quels états déclencheront un nouveau rendu du composant lorsqu'il sera mis à jour.Vous avez bien compris la première partie:
Oui
mapStateToProps
a l'état Store comme argument / paramètre (fourni parreact-redux::connect
) et son utilisé pour lier le composant avec une certaine partie de l'état store.En liant, je veux dire que l'objet retourné par
mapStateToProps
sera fourni au moment de la construction comme accessoires et tout changement ultérieur sera disponible viacomponentWillReceiveProps
.Si vous connaissez le modèle de conception Observer, c'est exactement cela ou une petite variation de celui-ci.
Un exemple aiderait à clarifier les choses:
Il peut y avoir un autre composant React appelé
itemsFilters
qui gère l'affichage et persiste l'état du filtre dans l'état Redux Store, le composant Demo "écoute" ou "est abonné" aux filtres d'état Redux Store pour que chaque fois que les filtres stockent les changements d'état (avec l'aide defiltersComponent
) réagissent -redux détecte qu'il y a eu un changement et notifie ou "publie" tous les composants d'écoute / abonnés en envoyant les changements à leurcomponentWillReceiveProps
qui, dans cet exemple, déclenchera un nouveau filtrage des éléments et rafraîchira l'affichage du fait que l'état de réaction a changé .Faites-moi savoir si l'exemple prête à confusion ou n'est pas assez clair pour fournir une meilleure explication.
Quant à: Cela signifie que l'état tel qu'il est consommé par votre composant cible peut avoir une structure très différente de l'état tel qu'il est stocké dans votre magasin.
Je n'ai pas compris la question, mais sachez simplement que l'état de réaction (
this.setState
) est totalement différent de l'état du magasin Redux!L'état React est utilisé pour gérer le redessin et le comportement du composant React. L'état de réaction est exclusivement contenu dans le composant.
L'état du magasin Redux est une combinaison d'états de réducteurs Redux, chacun étant responsable de la gestion d'une logique d'application de petite portion. Ces attributs réducteurs sont accessibles à l'aide de
react-redux::connect@mapStateToProps
n'importe quel composant! Ce qui rend l'état de la boutique Redux accessible à l'ensemble de l'application tandis que l'état des composants est exclusif à lui-même.la source
Cette réagir et Redux exemple est basé sur l'exemple de Mohamed Mellouki. Mais valide en utilisant des règles de raffinage et de peluchage . Notez que nous définissons nos accessoires et nos méthodes de répartition à l' aide de PropTypes afin que notre compilateur ne nous crie pas dessus . Cet exemple comprenait également quelques lignes de code qui manquaient dans l'exemple de Mohamed. Pour utiliser connect, vous devrez l'importer depuis react-redux . Cet exemple lie également la méthode filterItems, ce qui évitera des problèmes de portée dans le composant . Ce code source a été automatiquement formaté à l'aide de JavaScript Prettify .
Cet exemple de code est un bon modèle de point de départ pour votre composant.
la source
React-Redux
connect
est utilisé pour mettre à jour le magasin pour chaque action.C'est très simplement et clairement expliqué dans ce blog .
Vous pouvez cloner un projet github ou copier-coller le code de ce blog pour comprendre la connexion Redux.
la source
Voici un aperçu / passe-partout pour décrire le comportement de
mapStateToProps
:(Il s'agit d'une implémentation considérablement simplifiée de ce que fait un conteneur Redux.)
et ensuite
la source
}
}
la source