Я чувствую, что ни один из ответов не раскрылся, почему 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(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
синтаксис, который показан в большинстве примеров