Wydaje mi się, że żadna z odpowiedzi nie ukazuje, dlaczego mapDispatchToProps
jest przydatna.
Naprawdę można na to odpowiedzieć tylko w kontekście container-component
wzorca, który najlepiej zrozumiałem w pierwszym czytaniu: Składniki kontenera, a następnie użycie z React .
W skrócie, components
powinieneś 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 containers
są.
Dlatego „dobrze zaprojektowany” component
wzó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 mapDispatchToProps
przychodzi: 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.
component
We 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ć mapStateToProps
do tego samego celu, co mapDispatchToProps
z podstawowego powodu, dla którego nie masz dostępu do dispatch
wnętrza mapStateToProp
. Nie można więc użyć mapStateToProps
zapakowanego 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