J'ai l'impression qu'aucune des réponses n'a cristallisé pourquoi mapDispatchToPropsest utile.
Cela ne peut vraiment être répondu que dans le contexte du container-componentmodè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" componentdans 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à mapDispatchToPropsqu'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 componentdans le motif, FancyAlerterqui fait le rendu, n'a pas besoin de savoir quoi que ce soit: il obtient sa méthode pour appeler onClickdu 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 mapStateToPropsdans le même but que mapDispatchToPropspour la raison fondamentale pour laquelle vous n'avez pas accès à l' dispatchintérieur mapStateToProp. Vous ne pouvez donc pas utiliser mapStateToPropspour 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