J'ai l'impression qu'aucune des réponses n'a cristallisé pourquoi mapDispatchToProps
est utile.
On ne peut vraiment répondre à cette question que dans le cadre de l'enquête sur la santé des femmes. container-component
que j'ai trouvé plus facile à comprendre à la première lecture : Composants du conteneur puis Utilisation avec React .
En un mot, votre components
sont censés ne s'occuper que de l'affichage. Le site Le seul endroit où ils sont censés obtenir des informations est leur accessoire. .
Séparé de "l'affichage des trucs" (composants) est :
- comment faire pour que le truc s'affiche,
- et comment vous gérez les événements.
C'est ce que containers
sont pour.
Par conséquent, une "bonne conception" component
dans le modèle ressemblent à 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 les informations qu'il affiche à partir de props (qui proviennent du magasin redux via mapStateToProps
) et il tire également sa fonction d'action de ses accessoires : sendTheAlert()
.
C'est là que mapDispatchToProps
entre en jeu : dans la rubrique correspondante container
// 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 redux, dispatch, store, state et ... des trucs.
El component
dans le motif, FancyAlerter
qui effectue le rendu n'a pas besoin d'être informé de tout cela : il obtient sa méthode à appeler à l'endroit suivant onClick
du bouton, via ses props.
Et... mapDispatchToProps
était le moyen utile que redux fournit pour permettre au conteneur de passer facilement cette fonction dans le composant enveloppé sur ses props.
Tout cela ressemble beaucoup à l'exemple de todo dans la documentation, et à une autre réponse ici, mais j'ai essayé de l'adapter à la lumière du modèle pour mettre l'accent sur les points suivants pourquoi .
(Note : vous ne pouvez pas utiliser mapStateToProps
dans le même but que mapDispatchToProps
pour la simple raison que vous n'avez pas accès à dispatch
à l'intérieur de mapStateToProp
. Donc vous ne pouviez pas utiliser mapStateToProps
pour donner au composant enveloppé une méthode qui utilise dispatch
.
Je ne sais pas pourquoi ils ont choisi de le diviser en deux fonctions de cartographie. mapToProps(state, dispatch, props)
IE : une seule fonction pour faire les deux !
1 Notez que j'ai délibérément nommé explicitement 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 qui est montrée dans la plupart des exemples