У меня проблема при использовании Redux thunk с методом connect()
от react-redux. У меня есть следующий код:React Redux connect() с Redux thunk
function Component(props) {
return (
<button onClick={props.callback}>Click here</button>
);
}
function actionCreator() {
console.log('#1');
return dispatch => console.log('#2'); // = thunk
}
const mapDispatchToProps = dispatch => ({
callback: actionCreator
});
export const Container = connect(null, mapDispatchToProps)(Component);
Когда я визуализация Container
компонента и нажмите на кнопку, только «# 1» который отображаются в консоли. Таким образом, «thunk» не выполняется.
Когда я явно отправка actionCreator()
, он делает работу:
const mapDispatchToProps = dispatch => ({
callback: dispatch => dispatch(actionCreator())
});
The Redux docs says this about mapDispatchToProps:
Если объект будет принят, будет предполагаться, каждая функция внутри него, чтобы быть действие создатель Redux
Так почему же mapDispatchToProps не dispatch()
мой actionCreator()
? Я новичок в React, так что, может быть, я не понимаю это правильно?
Update
При использовании bindActionCreators()
из перевождь он делает работу:
const mapDispatchToProps = dispatch => {
return bindActionCreators({
callback: actionCreator
}, dispatch);
};
Является ли это правильный способ связать actioncreators с connect()
?
спасибо за ваш ответ. Я включил сокращающий пакет в качестве промежуточного программного обеспечения в свой магазин. Ваш код не работает. Он отправляет actionCreator непосредственно, когда компонент монтируется. Когда я затем нажимаю кнопку, я получаю сообщение об ошибке «this.props.callback не является функцией» –
Вы правы, я нашел настоящую проблему сейчас. Измените функцию 'mapDispatchToProps' на ' const mapDispatchToProps = dispatch => ({callback:() => dispatch (actionCreator())}; ' и он должен работать. Я отредактировал свой ответ выше, чтобы отразить это и объяснить, почему это необходимо! – mxstbr
Еще раз спасибо. Проблема в том, что 'callback: dispatch => dispatch (actionCreator())' действительно работает. Но тогда параметры, переданные в 'callback()' (из компонента), не будут переданы в 'actionCreator()'. Я обнаружил, что 'bindActionCreators()' работает пока. –