Ich habe das Gefühl, dass keine der Antworten herauskristallisiert hat, warum dies mapDispatchToPropsnützlich ist.
Dies kann wirklich nur im Kontext des container-componentMusters beantwortet werden , das ich am besten verstanden habe, indem ich zuerst gelesen habe: Containerkomponenten, dann Verwendung mit Reagieren .
Kurz gesagt, Sie componentssollten sich nur mit dem Anzeigen von Dingen befassen. Der einzige Ort, an dem sie Informationen erhalten sollen, sind ihre Requisiten .
Getrennt von "Anzeigen von Sachen" (Komponenten) ist:
- wie du das Zeug zum Anzeigen bringst,
- und wie Sie mit Ereignissen umgehen.
Dafür containerssind da.
Daher componentsieht ein "gut gestaltetes" Muster so aus:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Sehen Sie, wie diese Komponente die Informationen erhält, die sie von Requisiten anzeigt (die über aus dem Redux-Store kamen mapStateToProps), und wie sie ihre Aktionsfunktion von ihren Requisiten erhält : sendTheAlert().
Hier mapDispatchToPropskommt es ins Spiel: im entsprechendencontainer
// 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
)
Ich frage mich, ob Sie sehen können, jetzt, wo es die container 1 ist , die über Redux und Versand und Lagerung und Zustand und ... Zeug Bescheid weiß.
Das componentin dem Muster, FancyAlerterdas das Rendern ausführt, muss nichts davon wissen: Es erhält seine Methode onClick, um über seine Requisiten auf die Schaltfläche zuzugreifen.
Und ... mapDispatchToPropswar das nützliche Mittel, das Redux bietet, damit der Container diese Funktion problemlos an die verpackte Komponente seiner Requisiten weitergeben kann.
All dies sieht dem ToDo-Beispiel in den Dokumenten und einer weiteren Antwort hier sehr ähnlich, aber ich habe versucht, es im Lichte des Musters zu werfen, um zu betonen, warum .
(Hinweis: Sie können nicht mapStateToPropsfür den gleichen Zweck wie mapDispatchToPropsdie wesentlichen Grund dafür , dass Sie keinen Zugriff auf dispatchinnen , mapStateToPropdamit Sie nicht benutzen können. mapStateToPropsDer umwickelten Komponente zu geben , ein Verfahren , dass Verwendungen dispatch.
Ich weiß nicht, warum sie es in zwei Mapping-Funktionen unterteilt haben - es wäre vielleicht ordentlicher gewesen, wenn mapToProps(state, dispatch, props) IE eine Funktion für beide Funktionen hätte!
1 Beachten Sie, dass ich den Container absichtlich explizit benannt habe FancyButtonContainer, um hervorzuheben, dass es sich um ein "Ding" handelt - die Identität (und damit die Existenz!) Des Containers als "Ding" geht manchmal in der Kurzform verloren
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Syntax, die in den meisten Beispielen gezeigt wird