2016-02-29 17 views
6

connect()メソッドでReduxサンクを使用するときに問題が発生しました。react-reduxです。Redux connect()とReduxサンクを反応させる

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」がコンソールに表示されている:私は、次のコードを持っています。だから 'サンク'は実行されません。

私は明示的にactionCreator()を派遣する場合、それは動作しません:

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

The Redux docs says this about mapDispatchToPropsを:

オブジェクトが渡された場合、その内部の各機能が Reduxのアクションの作成者

であると想定されます

なぜ、mapDispatchToPropsはありません。dispatch()私のactionCreator()?私はReactを始めたばかりなので、それは分かりません。

更新

それがないReduxのからbindActionCreators()を使用して作業:

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

これはconnect()でactioncreatorsをバインドするための正しい方法は何ですか?

答えて

5

mapDispatchToPropsでは、関数の引数としてdispatch関数をオーバーライドしています。 dispatch => {function}を実行しているので、関数内のディスパッチは関数に渡す引数を参照するようになりましたが、引数を渡すことはありません。

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

これに変更し、それを、それが動作するはずです:

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

そのようにあなたがcallback()を呼び出すときに、dispatchmapDispatchToPropsによって渡さdispatch機能を指し、そしてアクションが派遣されます。

+1

あなたの答えに感謝します。私は私の店にミドルウェアとしてredux-thunkを含めました。あなたのコードは動作しません。コンポーネントのマウント時にactionCreatorを直接送出します。次にボタンをクリックすると "this.props.callbackは関数ではありません"というエラーが表示されます –

+0

あなたは正しいです、今実際の問題が見つかりました。 'mapDispatchToProps'関数を ' const mapDispatchToProps = dispatch => {callback :()=> dispatch(actionCreator())}); ' に変更してください。私はそれを反映するために上記の私の答えを編集し、それがなぜ必要なのか説明しています! – mxstbr

+0

もう一度ありがとうございます。問題は、 'callback:dispatch => dispatch(actionCreator())'が実際に動作することです。しかし、(コンポーネントから) 'callback()'に渡されたパラメータは 'actionCreator()'に渡されません。私は 'bindActionCreators()'が今のところ動作することを発見しました。 –

0

actionCreator関数が呼び出されたときに新しい関数を返すからです。 を削除してactionCreatorにすると正常に機能します。

+1

あなたの答えに感謝します。それは動作しません。サンクを定義する方法を関数に戻していないのですか? –

+0

@ Jan-PaulKleemansあなたはjsfiddleを提供できますか?だから私はあなたを助けることができます。 – geniuscarrier

+0

bindActionCreators()は今のところ動作することがわかりました。ご協力いただきありがとうございます。 –

関連する問題