J'ai l'impression qu'aucune des réponses n'a cristallisé pourquoi mapDispatchToProps
est utile.
Cela ne peut vraiment être répondu que dans le contexte du container-component
modèle, que j'ai trouvé le mieux compris en première lecture: Composants de conteneur puis Utilisation avec React .
En un mot, vous components
êtes censé ne vous soucier que d'afficher des choses. Le seul endroit où ils sont censés obtenir des informations est leurs accessoires .
Séparé de "l'affichage des éléments" (composants) est:
- comment afficher les éléments,
- et comment vous gérez les événements.
C'est pour ça containers
.
Par conséquent, un "bien conçu" component
dans le modèle ressemble à ceci:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Voyez comment ce composant obtient l'information qu'il affiche d'accessoires (qui est venu du magasin redux via mapStateToProps
) et il obtient également sa fonction d'action de ses accessoires: sendTheAlert()
.
C'est là mapDispatchToProps
qu'intervient: dans le correspondantcontainer
// FancyButtonContainer.js
function mapDispatchToProps(dispatch) {
return({
sendTheAlert: () => {dispatch(ALERT_ACTION)}
})
}
function mapStateToProps(state) {
return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}
export const FancyButtonContainer = connect(
mapStateToProps, mapDispatchToProps)(
FancyAlerter
)
Je me demande si vous pouvez voir, maintenant que c'est le container
1 qui connaît le redux et l'expédition et le stockage et l'état et ... des trucs.
Le component
dans le motif, FancyAlerter
qui fait le rendu, n'a pas besoin de savoir quoi que ce soit: il obtient sa méthode pour appeler onClick
du bouton, via ses accessoires.
Et ... mapDispatchToProps
était le moyen utile que redux fournit pour laisser le conteneur passer facilement cette fonction dans le composant enveloppé sur ses accessoires.
Tout cela ressemble beaucoup à l'exemple des tâches dans les documents, et une autre réponse ici, mais j'ai essayé de le lancer à la lumière du motif pour souligner pourquoi .
(Remarque: vous ne pouvez pas utiliser mapStateToProps
dans le même but que mapDispatchToProps
pour la raison fondamentale pour laquelle vous n'avez pas accès à l' dispatch
intérieur mapStateToProp
. Vous ne pouvez donc pas utiliser mapStateToProps
pour donner au composant encapsulé une méthode qui utilise dispatch
.
Je ne sais pas pourquoi ils ont choisi de le diviser en deux fonctions de mappage - il aurait peut-être été plus judicieux d'avoir mapToProps(state, dispatch, props)
IE une fonction pour faire les deux!
1 Notez que j'ai délibérément explicitement nommé le conteneur FancyButtonContainer
, pour souligner qu'il s'agit d'une «chose» - l'identité (et donc l'existence!) Du conteneur en tant que «chose» est parfois perdue dans la sténographie
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
syntaxe indiquée dans la plupart des exemples