Redux docs pour bindActionCreators indiquent que:
Le seul cas d'utilisation pour
bindActionCreators
est lorsque vous souhaitez transmettre certains créateurs d'action à un composant qui ne connaît pas Redux, et que vous ne souhaitez pas lui transmettre la répartition ou le magasin Redux.
Quel serait un exemple où bindActionCreators
serait utilisé / nécessaire?
Quel type de composant ne serait pas au courant Redux ?
Quels sont les avantages / inconvénients des deux options?
//actionCreator
import * as actionCreators from './actionCreators'
function mapStateToProps(state) {
return {
posts: state.posts,
comments: state.comments
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(actionCreators, dispatch)
}
contre
function mapStateToProps(state) {
return {
posts: state.posts,
comments: state.comments
}
}
function mapDispatchToProps(dispatch) {
return {
someCallback: (postId, index) => {
dispatch({
type: 'REMOVE_COMMENT',
postId,
index
})
}
}
}
la source
#3
un raccourci pour l'option#1
?mapDispatchToProps
:function
,object
et disparus. Comment gérer chaque cas est défini iciredux
etconnect
etaddDispatchToProps
au composant simple semble exagéré si je peux simplement passer un accessoire vers le bas. Mais pour autant que je sache, presque tous les cas pourmapDispatch
les accessoires seront soit des options,#1
soit#3
mentionnés dans la réponse99% du temps, il est utilisé avec la fonction React-Redux
connect()
, dans le cadre dumapDispatchToProps
paramètre. Il peut être utilisé explicitement dans lamapDispatch
fonction que vous fournissez, ou automatiquement si vous utilisez la syntaxe abrégée de l'objet et passez un objet plein de créateurs d'action àconnect
.L'idée est qu'en pré-liant les créateurs d'actions, le composant
connect()
auquel vous passez techniquement "ne sait" pas qu'il est connecté - il sait juste qu'il doit fonctionnerthis.props.someCallback()
. D'un autre côté, si vous n'avez pas lié les créateurs d'action et que vous avez appeléthis.props.dispatch(someActionCreator())
, le composant "sait" maintenant qu'il est connecté car il s'attendprops.dispatch
à exister.J'ai écrit quelques réflexions sur ce sujet dans mon article de blog Idiomatic Redux: Pourquoi utiliser des créateurs d'action? .
la source
Exemple plus complet, passez un objet plein de créateurs d'action à se connecter:
la source
Je vais essayer de répondre aux questions originales ...
Composants intelligents et stupides
Dans votre première question, vous demandez essentiellement pourquoi
bindActionCreators
est nécessaire en premier lieu, et quel type de composants ne doit pas être conscient de Redux.En bref, l'idée ici est que les composants doivent être divisés en composants intelligents (conteneur) et stupides (présentation). Les composants stupides fonctionnent sur la base du besoin de savoir. Leur travail d'âme est de rendre les données données en HTML et rien de plus. Ils ne doivent pas être conscients du fonctionnement interne de l'application. Ils peuvent être considérés comme la couche avant profonde de la peau de votre application.
D'autre part, les composants intelligents sont une sorte de colle, qui prépare les données pour les composants stupides et ne fait de préférence pas de rendu HTML.
Ce type d'architecture favorise un couplage lâche entre la couche d'interface utilisateur et la couche de données en dessous. Cela permet à son tour de remplacer facilement l'une des deux couches par autre chose (c'est-à-dire une nouvelle conception de l'interface utilisateur), qui ne cassera pas l'autre couche.
Pour répondre à votre question: les composants stupides ne devraient pas être conscients de Redux (ou de tout détail d'implémentation inutile de la couche de données d'ailleurs) car nous pourrions vouloir le remplacer par autre chose à l'avenir.
Vous pouvez en savoir plus sur ce concept dans le manuel Redux et plus en détail dans l'article Presentational and Container Components de Dan Abramov.
Quel exemple est le meilleur
La seconde question portait sur les avantages / inconvénients des exemples donnés.
Dans le premier exemple, les créateurs d'actions sont définis dans un
actionCreators
fichier / module séparé , ce qui signifie qu'ils peuvent être réutilisés ailleurs. C'est à peu près la manière standard de définir les actions. Je ne vois vraiment aucun inconvénient à cela.Le deuxième exemple définit les créateurs d'actions en ligne, ce qui présente plusieurs inconvénients:
consts
séparément, afin qu'ils puissent être référencés dans des réducteurs - ce qui réduirait les risques d'erreurs de frappeLe deuxième exemple présente un avantage par rapport au premier: il est plus rapide à écrire! Donc, si vous n'avez pas de meilleurs plans pour votre code, cela pourrait être très bien.
J'espère avoir réussi à clarifier un peu les choses ...
la source
Une utilisation possible de
bindActionCreators()
est de «mapper» plusieurs actions ensemble comme un seul accessoire.Un envoi normal ressemble à ceci:
Mappez quelques actions utilisateur courantes sur des accessoires.
Dans les projets plus importants, la cartographie de chaque expédition séparément peut sembler lourde. Si nous avons un ensemble d'actions qui sont liées les unes aux autres, nous pouvons combiner ces actions . Par exemple, un fichier d'action utilisateur qui effectue toutes sortes d'actions différentes liées à l'utilisateur. Au lieu d'appeler chaque action comme une distribution distincte, nous pouvons utiliser à la
bindActionCreators()
place dedispatch
.Dépêches multiples utilisant bindActionCreators ()
Importez toutes vos actions associées. Ils sont probablement tous dans le même fichier dans le magasin redux
Et maintenant, au lieu d'utiliser la répartition, utilisez bindActionCreators ()
Maintenant, je peux utiliser l'accessoire
userAction
pour appeler toutes les actions de votre composant.IE:
userAction.login()
userAction.editEmail()
outhis.props.userAction.login()
this.props.userAction.editEmail()
.REMARQUE: vous ne devez pas mapper le bindActionCreators () à un seul accessoire. (Le supplémentaire
=> {return {}}
qui correspond àuserAction
). Vous pouvez également utiliserbindActionCreators()
pour mapper toutes les actions d'un seul fichier en tant qu'accessoires séparés. Mais je trouve que faire cela peut être déroutant. Je préfère que chaque action ou "groupe d'action" reçoive un nom explicite. J'aime aussi nommer leownProps
pour être plus descriptif sur ce que sont ces "accessoires pour enfants" ou d'où ils viennent. Lorsque vous utilisez Redux + React, il peut être un peu déroutant de savoir où tous les accessoires sont fournis, donc plus ils sont descriptifs, mieux c'est.la source
en utilisant
bindActionCreators
, il peut regrouper plusieurs fonctions d'action et les transmettre à un composant qui ne connaît pas Redux (Dumb Component) comme cecila source
Je cherchais également à en savoir plus sur bindActionsCreators et voici comment je l'ai implémenté dans mon projet.
Dans votre composant React
la source
Un cas d'utilisation intéressant pour
bindActionCreators
est l'intégration avec redux-saga en utilisant redux-saga-routines . Par exemple:Notez que ce modèle peut être implémenté en utilisant React Hooks (à partir de React 16.8).
la source
La déclaration de la documentation est très claire:
Il s'agit clairement d'un cas d'utilisation qui peut survenir dans les conditions suivantes et dans une seule condition:
Disons que nous avons les composants A et B:
Injecter pour react-redux: (A)
Injecté par react-redux: (B)
Vous avez remarqué ce qui suit?
Nous avons mis à jour le magasin redux via le composant A alors que nous ne connaissions pas le magasin redux dans le composant B.
Nous ne mettons pas à jour dans le composant A. Pour savoir ce que je veux dire exactement, vous pouvez explorer ce post . J'espère que vous aurez une idée.
la source