Как работает connect без mapDispatchToProps
Я читал пример docs для redux и нашел этот пример компонента контейнера. Может кто-нибудь объяснить, почему в данном случае mapDispatchToProps здесь не нужен. Кроме того, как функция получает функцию диспетчеризации?
import React from 'react'
import { connect } from 'react-redux'
import { addTodo } from '../actions'
let AddTodo = ({ dispatch }) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
dispatch(addTodo(input.value))
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Add Todo
</button>
</form>
</div>
)
}
AddTodo = connect()(AddTodo)
export default AddTodo
2 ответов:
connect()(AddTodo)передастdispatchкак компонентprop to AddTodo, который все еще полезен даже без состояния или предопределенных действий. Вот почемуmapDispatchToPropsне нужен в вашем кодеТеперь в вашем компоненте
let AddTodo = ({ dispatch }) => {Вы разрушаете свой реквизит, чтобы получить доступ только кdispatch.Если вы используете
mapDispatchToProps, вы сделаете ваше действиеaddTodoдоступным в качестве опоры для вашего компонента, а затем назовете егоthis.props.addTodo. Таким образом, приведенный выше подход является альтернативой. Это зависит от вас, чтобы выбрать то, что вы чувствуете себя комфортно с
connectпросто передаетstore / dispatchчерез контекст React, поэтому вам не нужно передавать хранилище через множество компонентов. Однако вам не нужно использовать connect. Любой модуль / специальный шаблон может работать, подключение просто оказывается удобной вещью для использования.Использование
dispatchв компоненте или использованиеmapDispatchToProps- это одно и то же.Однако использование
mapDispatchToPropsдает вам гораздо больше гибкости в структурировании кода и размещении всех создателей действий в одном месте.Как в соответствии с документы:
[mapDispatchToProps (dispatch, [ownProps]): dispatchProps] (объект или функция):
Если объект передается , каждая функция внутри него считается создателем действия Redux. Объект с теми же именами функций, но с каждое действие создатель обернул в диспетчерский вызов, так что они могут быть вызывается непосредственно, будет объединен в реквизит компонента.
Если функция является передано, будет дана отправка в качестве первого параметра. Это до вас, чтобы вернуть объект, который каким-то образом использует отправка, чтобы связать создателей действия по-своему. (Совет: вы можете использовать помощник
bindActionCreators()из Redux.)Если ваша функция
mapDispatchToPropsобъявлена как принимающая два параметры, он будет вызван с диспетчеризацией как первый параметр и реквизит, передаваемый подключенному компоненту в качестве второго параметра, и будет повторно вызываться всякий раз, когда подключенный компонент получает новый реквизит. (Второй параметр обычно называется ownProps by конвенция.)Если вы не предоставляете свою собственную
mapDispatchToPropsфункцию или объект полный создателей действий, по умолчаниюmapDispatchToPropsреализация просто вводит диспетчеризацию в реквизит вашего компонента.
Люди склонны писать
reactдвумя способами. Один из них-подход, основанный наclass, с которым вы обычно сталкиваетесь. Он в основном использует классы.class App extends Component{ constructor(){ super(); this.state={} } render(){ return( // ); } }И другое есть
functional approach.Таким образом, в функциональном подходе вы можете передавать данные в видеconst App = (props) => { return( <div><h2>{{props.name}}</h2></div> ) }argumentsвашим компонентам. Итак, если вы передалиdispatchот родительского компонента к этому компоненту вprops. Вы можете получить к нему доступ, используяprops.dispatch.
Comments