Я чувствую, что ни один из ответов не раскрылся, почему mapDispatchToPropsэто полезно.
На это действительно можно ответить только в контексте container-componentшаблона, который я нашел наиболее понятным при первом прочтении: компоненты контейнера, затем использование с React .
Короче говоря, вы componentsдолжны заниматься только показом вещей. Единственное место , где они должны получить информацию от является их реквизитом .
Отдельно от «отображения материала» (компонентов) есть:
- как вы получаете материал для отображения,
- и как вы обрабатываете события.
Вот для чего containers.
Следовательно, «хорошо разработанный» componentшаблон выглядит так:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Посмотрите , как этот компонент получает информацию он отображает из реквизита (который пришел из Redux магазина через mapStateToProps) , и он также получает функцию действия от ее реквизита: sendTheAlert().
Вот где mapDispatchToPropsприходит: в соответствующем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
)
Интересно, видите ли вы, что теперь это container 1, который знает о редуксе, диспетчеризации, хранении, состоянии и ... вещах.
componentВ шаблоне, FancyAlerter, что делает рендеринг не нужно знать о какой - либо из этого материала: он получает свой метод для вызова на onClickкнопки, с помощью его реквизита.
И ... mapDispatchToPropsбыло полезным средством, которое предоставляет redux, чтобы позволить контейнеру легко передавать эту функцию в обернутый компонент на его подпорках.
Все это очень похоже на пример todo в документах и другой ответ здесь, но я попытался привести его в свете схемы, чтобы подчеркнуть почему .
(Примечание: вы не можете использовать mapStateToPropsдля той же цели, что и mapDispatchToPropsпо основной причине, к которой у вас нет доступа dispatchвнутрь mapStateToProp. Поэтому вы не можете использовать, mapStateToPropsчтобы предоставить завернутому компоненту метод, который использует dispatch.
Я не знаю, почему они решили разбить его на две функции отображения - возможно, было бы лучше иметь mapToProps(state, dispatch, props) одну функцию IE для выполнения обеих!
1 Обратите внимание, что я намеренно явно назвал контейнер FancyButtonContainer, чтобы подчеркнуть, что это «вещь» - идентичность (и, следовательно, существование!) Контейнера как «вещь» иногда теряется в стенографии
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
синтаксис, который показан в большинстве примеров