Wydaje mi się, że żadna z odpowiedzi nie ukazuje, dlaczego mapDispatchToPropsjest przydatna.
Naprawdę można na to odpowiedzieć tylko w kontekście container-componentwzorca, który najlepiej zrozumiałem w pierwszym czytaniu: Składniki kontenera, a następnie użycie z React .
W skrócie, componentspowinieneś zajmować się tylko wyświetlaniem rzeczy. Jedyne miejsce oni mają dostać informację z jest ich rekwizyty .
Od „wyświetlania rzeczy” (komponentów) oddzielone jest:
- w jaki sposób wyświetlasz rzeczy,
- i jak radzisz sobie ze zdarzeniami.
Po to containerssą.
Dlatego „dobrze zaprojektowany” componentwzór wygląda następująco:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Zobacz, w jaki sposób ten komponent pobiera informacje, które wyświetla z rekwizytów (które pochodzą ze sklepu redux przez mapStateToProps), a także pobiera swoją funkcję akcji ze swoich rekwizytów:sendTheAlert() .
Tam właśnie mapDispatchToPropsprzychodzi: w odpowiednimcontainer
// 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
)
Zastanawiam się, czy widzisz, teraz, gdy jest to container 1 który wie o redux i wysyłce oraz o przechowywaniu, stanie i ... rzeczach.
componentWe wzorcu, FancyAlerter, co robi renderowania nie musi wiedzieć o żadnej z tych rzeczy: to dostaje swoją metodę na wywołanieonClick przycisku, za pośrednictwem swoich rekwizytów.
I ... mapDispatchToProps był użytecznym środkiem, który zapewnia redux, aby umożliwić kontenerowi łatwe przekazanie tej funkcji do owiniętego komponentu na jego rekwizytach.
Wszystko to bardzo przypomina przykład todo w dokumentach i kolejną odpowiedź tutaj, ale próbowałem rzucić go w świetle wzoru, aby podkreślić, dlaczego .
(Uwaga: nie można używać mapStateToPropsdo tego samego celu, co mapDispatchToPropsz podstawowego powodu, dla którego nie masz dostępu do dispatchwnętrza mapStateToProp. Nie można więc użyć mapStateToPropszapakowanego komponentu do metody, która używa dispatch.
Nie wiem, dlaczego zdecydowali się podzielić go na dwie funkcje mapowania - być może łatwiej byłoby mieć mapToProps(state, dispatch, props) jedną funkcję IE do obu!
1 Zauważ, że celowo wyraźnie nadałem nazwę kontenerowi FancyButtonContainer, aby podkreślić, że jest to „rzecz” - tożsamość (a zatem i istnienie!) Kontenera jako „rzecz” jest czasami gubiona w skrócie
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
składnia pokazana w większości przykładów