2016-02-29 4 views
6

У меня проблема при использовании 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()?

ответ

5

В вашем mapDispatchToProps вы переопределяете функцию dispatch, сделав ее аргументом функции. Поскольку вы делаете dispatch => {function}, отправка внутри функции теперь относится к аргументу, который вы передаете функции, но вы не передаете ему никаких аргументов.

callback: dispatch => dispatch(actionCreator()) 
      //^overrides^

Изменить его к этому, и он должен работать:

const mapDispatchToProps = dispatch => ({ 
    callback:() => dispatch(actionCreator()) 
}); 

Таким образом, когда вы звоните callback(), то dispatch относится к пройденному dispatch функции по mapDispatchToProps, и действие получает посланным.

+1

спасибо за ваш ответ. Я включил сокращающий пакет в качестве промежуточного программного обеспечения в свой магазин. Ваш код не работает. Он отправляет actionCreator непосредственно, когда компонент монтируется. Когда я затем нажимаю кнопку, я получаю сообщение об ошибке «this.props.callback не является функцией» –

+0

Вы правы, я нашел настоящую проблему сейчас. Измените функцию 'mapDispatchToProps' на ' const mapDispatchToProps = dispatch => ({callback:() => dispatch (actionCreator())}; ' и он должен работать. Я отредактировал свой ответ выше, чтобы отразить это и объяснить, почему это необходимо! – mxstbr

+0

Еще раз спасибо. Проблема в том, что 'callback: dispatch => dispatch (actionCreator())' действительно работает. Но тогда параметры, переданные в 'callback()' (из компонента), не будут переданы в 'actionCreator()'. Я обнаружил, что 'bindActionCreators()' работает пока. –

0

Это потому, что функция actionCreator возвращает новую функцию при ее вызове. Удалите return в actionCreator, чтобы он работал.

+1

спасибо за ваш ответ. Это не работает.Не возвращает функцию способ определения thunks? –

+0

@ Jan-PaulKleemans Можете ли вы предоставить jsfiddle? Поэтому я могу помочь вам. – geniuscarrier

+0

Я обнаружил, что bindActionCreators() работает пока. Спасибо за вашу помощь. –

Смежные вопросы