Я відчуваю, що жодна з відповідей не викристалізувала, чому mapDispatchToPropsце корисно.
На це дійсно можна відповісти лише в контексті container-componentшаблону, який я знайшов найкращим розумінням у першому читанні: Компоненти контейнерів, а потім використання з реагуванням .
Коротше кажучи, ваших, 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(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
синтаксис, який показаний у більшості прикладів