Я чувствую, что ни один из ответов не раскрылся, почему 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(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
синтаксис, который показан в большинстве примеров
ALERT_ACTION
функция действия или функция,type
которая возвращается из функции действия? : / так озадаченЭто в основном сокращение. Поэтому вместо того, чтобы писать:
Вы должны использовать mapDispatchToProps, как показано в вашем примере кода, а затем в другом месте написать:
или, скорее всего, в этом случае вы бы использовали это в качестве обработчика событий:
Вот полезное видео Дана Абрамова об этом здесь: https://egghead.io/lessons/javascript-redux-generating-containers-with-connect-from-react-redux-visibletodolist
источник
mapDispatch
функцию, Redux будет использовать значение по умолчанию. ЭтаmapDispatch
функция по умолчанию просто беретdispatch
ссылку на функцию и дает ее вам какthis.props.dispatch
.mapStateToProps()
это утилита, которая помогает вашему компоненту получить обновленное состояние (которое обновляется некоторыми другими компонентами),mapDispatchToProps()
это утилита, которая поможет вашему компоненту инициировать событие действия (диспетчеризация действия, которое может вызвать изменение состояния приложения)источник
mapStateToProps
,mapDispatchToProps
аconnect
изreact-redux
библиотеки предоставляет удобный способ доступа к вашемуstate
иdispatch
функции вашего магазина. Таким образом, по сути, соединение - это компонент высшего порядка, вы также можете подумать, что это обертка, если это имеет смысл для вас. Таким образом, каждый раз, когда вашеstate
изменениеmapStateToProps
будет изменено, будет вызываться ваш новыйstate
и впоследствии, когда выprops
обновляете компонент, будет запускаться функция рендеринга для отображения вашего компонента в браузере.mapDispatchToProps
также хранит значения ключейprops
вашего компонента, обычно они принимают форму функции. Таким образом, вы можете вызватьstate
изменения из вашего компонентаonClick
,onChange
события.Из документов:
Также убедитесь, что вы знакомы с функциями React без состояния и компонентами высшего порядка.
источник
mapStateToProps
получаетstate
иprops
и позволяет извлечь реквизит из состояния для передачи компоненту.mapDispatchToProps
получаетdispatch
иprops
и предназначено для вас, чтобы связать создателей действия с отправкой, поэтому при выполнении результирующей функции действие отправляется.Я считаю, что это только избавляет вас от необходимости делать
dispatch(actionCreator())
внутри вашего компонента, что делает его немного легче для чтения.https://github.com/reactjs/react-redux/blob/master/docs/api.md#arguments
источник
dispatch
метода? Откуда это взялось?<Provider/>
самим. Он выполняет свою собственную магию компонентов высокого порядка, чтобы гарантировать, что отправление доступно в его дочерних компонентах.Теперь предположим, что для редукса есть действие:
Когда вы импортируете его,
Как говорит название функции
mapDispatchToProps()
, сопоставьтеdispatch
действие с реквизитом (реквизит нашего компонента)Таким образом, опора
onTodoClick
является ключом кmapDispatchToProps
функции, которая делегирует дальнейшие действияaddTodo
.Также, если вы хотите обрезать код и обойти ручную реализацию, то вы можете сделать это,
Что именно означает
источник