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