Ich habe das Gefühl, dass keine der Antworten herauskristallisiert hat, warum dies mapDispatchToProps
nützlich ist.
Dies kann wirklich nur im Kontext des container-component
Musters beantwortet werden , das ich am besten verstanden habe, indem ich zuerst gelesen habe: Containerkomponenten, dann Verwendung mit Reagieren .
Kurz gesagt, Sie components
sollten 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 containers
sind da.
Daher component
sieht 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 mapDispatchToProps
kommt 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 component
in dem Muster, FancyAlerter
das das Rendern ausführt, muss nichts davon wissen: Es erhält seine Methode onClick
, um über seine Requisiten auf die Schaltfläche zuzugreifen.
Und ... mapDispatchToProps
war 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 mapStateToProps
für den gleichen Zweck wie mapDispatchToProps
die wesentlichen Grund dafür , dass Sie keinen Zugriff auf dispatch
innen , mapStateToProp
damit Sie nicht benutzen können. mapStateToProps
Der 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