Я новичок в javascript / redux / react, создаю небольшое приложение с redux, react-redux и react. По какой-то причине при использовании функции mapDispatchToProps в тандеме с connect (привязка response-redux) я получаю TypeError, указывающий, что отправка не является функцией, когда я пытаюсь выполнить полученную опору. Однако когда я вызываю диспетчеризацию как опору (см. Функцию setAddr в предоставленном коде), она работает.
Мне любопытно, почему это так, в примере приложения TODO в документации redux метод mapDispatchToProps настраивается таким же образом. Когда я console.log (отправка) внутри функции, он говорит, что отправка - это объект типа. Я мог бы продолжать использовать диспетчеризацию таким образом, но мне было бы лучше знать, почему это происходит, прежде чем я продолжу работу с redux. Я использую webpack с загрузчиками babel для компиляции.
Мой код:
import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';
import { setAddresses } from '../actions.js';
import GeoCode from './geoCode.js';
import FlatButton from 'material-ui/lib/flat-button';
const Start = React.createClass({
propTypes: {
onSubmit: PropTypes.func.isRequired
},
setAddr: function(){
this.props.dispatch(
setAddresses({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})
)
},
render: function() {
return (
<div>
<div className="row">
<div className="col-xs-6">
<GeoCode ref='pickup' />
</div>
<div className="col-xs-6">
<GeoCode ref='dropoff' />
</div>
</div>
<div className="row">
<div className="col-xs-6">
<FlatButton
label='Does Not Work'
onClick={this.props.onSubmit({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})}
/>
</div>
<div className="col-xs-6">
<FlatButton
label='Works'
onClick={this.setAddr}
/>
</div>
</div>
</div>
);
}
})
const mapDispatchToProps = (dispatch) => {
return {
onSubmit: (data) => {
dispatch(setAddresses(data))
}
}
}
const StartContainer = connect(mapDispatchToProps)(Start)
export default StartContainer
Приветствия.
источник
Ответы:
Если вы хотите использовать
mapDispatchToProps
безmapStateToProps
использованияnull
первого аргумента.export default connect(null, mapDispatchToProps)(Start)
источник
mapDispatchToProps
, просто не добавляйте этот аргумент кconnect
:connect(mapStateToProps)(MyComponent)
Вам просто не хватает первого аргумента
connect
, которым являетсяmapStateToProps
метод. Выдержка из приложения Redux todo:источник
использование
вместо того
источник
Я решил это, переставив аргументы, я использовал
что неправильно.
mapStateToProps
Должно быть первым аргументом:Сейчас это звучит очевидно, но может кому-то помочь.
источник
Мне нужен был пример использования,
React.Component
поэтому я публикую его:источник
вопрос
Вот несколько вещей, на которые следует обратить внимание, чтобы понять поведение подключенного компонента в вашем коде:
Арность
connect
вопросов:connect(mapStateToProps, mapDispatchToProps)
React-Redux вызывает
connect
с первым аргументомmapStateToProps
и вторым аргументомmapDispatchToProps
.Следовательно, хотя вы и передали свой
mapDispatchToProps
, React-Redux фактически рассматривает это какmapState
первый аргумент. Вы по-прежнему получаете внедреннуюonSubmit
функцию в своем компоненте, потому что возвратmapState
объединяется в свойства вашего компонента. Но это не то, какmapDispatch
следует вводить.Вы можете использовать
mapDispatch
без определенияmapState
. Передайтеnull
вместо,mapState
и ваш компонент не будет подвергаться изменениям в хранилище.Connected компонент получает
dispatch
по умолчанию, когда нетmapDispatch
ПРЕДОСТАВЛЯЕТСЯКроме того, ваш компонент получает,
dispatch
потому что он получилnull
за свою вторую позициюmapDispatch
. Если вы правильно передадитеmapDispatch
, ваш компонент не получитdispatch
.Обычная практика
Вышеупомянутый ответ объясняет, почему компонент так себя ведет. Тем не менее, это обычная практика, когда вы просто передаете свой создатель действий, используя
mapStateToProps
сокращение объекта. И назовите это в своем компоненте.onSubmit
То есть:источник
Когда вы не указываете
mapDispatchToProps
в качестве второго аргумента, например:тогда вы автоматически получаете отправку в свойства компонента, поэтому вы можете просто:
без mapDispatchToProps
источник
Я использую вот так ... его легко понять, первый аргумент - это mapStateToProps, а второй аргумент - это mapDispatchToProps, в конце концов соединитесь с функцией / классом.
источник
Иногда эта ошибка также возникает, когда вы изменяете порядок функции компонента при переходе на соединение.
Неправильный порядок:
Правильный заказ:
источник
Ловушка, в которую могут войти некоторые, рассматривается в этом вопросе, но не рассматривается в ответах, поскольку она немного отличается по структуре кода, но возвращает точно такую же ошибку.
Эта ошибка возникает при использовании
bindActionCreators
и отсутствии передачиdispatch
функцииКод ошибки
Фиксированный код
Функция
dispatch
отсутствовала в коде ошибкиисточник
Функция React-redux 'connect' принимает два аргумента, первый - это mapStateToProps, а второй - проверка mapDispatchToProps ниже ex.
export default connect(mapStateToProps, mapDispatchToProps)(Index);
`Если мы не хотим получать состояние из redux, мы устанавливаем null вместо mapStateToProps.
export default connect(null, mapDispatchToProps)(Index);
источник