2017-12-25 21 views
1

私はフロントエンドでreact + reduxで働いていました。我々はすべてのReduxのlogic.Praticallyホスティング事業を担当してコンテナコンポーネントを作成することを知っているようReact + Redux +サンクでビジネスロジックを整理する方法

、我々は我々が取得するためにイベントを送出することができますmapDispatchToPropsでespetially、mapStateToPropsとコネクト機能についてmapDispatchToPropsを提供しますレデューサーは大きく働いています。

多くの種類のタイプを持ち、それぞれが10ステップ以上あるので、「次のステップ」、「前のステップ」コマンドを構成し、検証のような子要素の関数を呼び出すこれらのボタンをクリックします。しかし、私は "ref"は推奨された方法ではないと思います。しかし再来のオリジナルデザインで、私は次のコードでイベントを送出しなければならない

const mapDispatchToProps = (dispatch, ownProps) => ({ 
    onNext:() => { 
     dispatch(nextStep()); 
    } 
} 

どこでReduxのデザインの子コントロールの検証問題があるが、呼び出す方法、多分私達は、アクションの作成者でそれを処理する必要がありますが、私はそれがasyn要求または単に普通のオブジェクトを持つアクションだと思う、それはロジックを処理すべきではない。

だから私は以下のように子コンテナ内のコントローラを公開:

export { 
    childContainer, 
    childNavController 
}; 

検証機能を公開するために、childNavControllerを子要素とロジックをレンダリングするために使用される子コンテナを。しかし、このように我々はディスパッチオブジェクトへのアクセスを持っていないので、私は以下のことを実行します。私はまた、これは理にかなっての方法です

const nextStep=(childCreator)=>{ 
    return function (dispatch, getState) { 
    return Promise.resolve().then(()=>{ 
     const currentState = getState(); 
     const controller=childCreator(currentState.step); 
     // this make the business also can work with dispatch object 
     controller.validation(dispatch,getState); 
    }); 
    } 
} 

、しかし:アクションクリエータファイルで

const mapDispatchToProps = (dispatch, ownProps) => ({ 
    onNext:() => { 
     dispatch(nextStep(wizardCreator)); 
    } 
} 
const wizardCreator= (step) => { 
    // according to the step reuturn different controller instance 
    return childNavController; 
}; 

それは奇妙な、OO、いいえ、エレガントなデザイン、ちょうどそれを得るために思った。

このシナリオのための提案や設計がある場合は、

答えて

1

コンポーネント内でアクションをディスパッチするために、mapDispatchToPropsを使用することは必須ではありません。 connect(null)(Component)を呼び出すために、コンポーネントはディスパッチ機能をプロップとして受け取ります。次に、必要なアクションをディスパッチする前に、メソッドを定義して検証のロジックを実行することができます。例えば

、実際Reduxの中に容器が再来して接続関数によって生成される

+0

import React from 'react'; import { connect } from 'react-redux'; const Container = (props) => { const onClick =() => { // some logic if (valid) props.dispatch(someAction()) } return <button onClick={onClick}>Next</button> } export default connect()(Container); 
。もちろん、あなたのコード内のコンテナは表現コンポーネントですが、コンテナコンポーネントを使用できることはわかっていますが、複雑なUIを2つのファイルに分けたいのですが、プレゼンテーションは1つで、ファイルは接続の結果のみをエクスポートします。そのような場合にディスパッチと状態を合理的に取得する方法(mapDispatchToPropsではなく) – RonSmith

関連する問題