2016-08-31 16 views
28

私は減速機を持っており、新しい状態を計算するためには、この減速機によって管理されていない状態の一部からのデータとアクションからのデータが必要です。具体的には、私が下に示す還元剤では、accountDetails.stateOfResidenceIdフィールドにアクセスする必要があります。Redux reducerの内部の状態にアクセスするには?

initialState.js:

export default { 
    accountDetails: { 
     stateOfResidenceId: '', 
     accountType: '', 
     accountNumber: '', 
     product: '' 
    }, 
    forms: { 
     blueprints: [ 

     ] 
    } 
}; 

formsReducer.js:

import * as types from '../constants/actionTypes'; 
import objectAssign from 'object-assign'; 
import initialState from './initialState'; 
import formsHelper from '../utils/FormsHelper'; 
export default function formsReducer(state = initialState.forms, action) { 
    switch (action.type) { 
    case types.UPDATE_PRODUCT: { 
     //I NEED accountDetails.stateOfResidenceId HERE 
     console.log(state); 
     const formBlueprints = formsHelper.getFormsByProductId(action.product.id); 
     return objectAssign({}, state, {blueprints: formBlueprints}); 
    } 

    default: 
     return state; 
    } 
} 

index.js(ルートリデューサ):

import { combineReducers } from 'redux'; 
import accountDetails from './accountDetailsReducer'; 
import forms from './formsReducer'; 

const rootReducer = combineReducers({ 
    accountDetails, 
    forms 
}); 

export default rootReducer; 

このフィールドにはどのようにアクセスできますか?

+0

[アプリケーションの状態に基づいて状態を更新すると、アンチです:あなたがそうのようなあなたのコード内の任意の場所の状態を取得することができます

redux-named-reducers

を-pattern](https://stackoverflow.com/questions/35851837/redux-and-within-a-reducer-accessing-a-different-reducer-how) – Igorsvee

+5

この文は意味をなさない。減速機能の全ポイントは、あなたが*現在の状態*と行動に基づいて決定を下すことです。 – markerikson

答えて

41

私はこのためthunkを使用することになり、ここでの例です:

export function updateProduct(product) { 
    return (dispatch, getState) => { 
    const { accountDetails } = getState(); 

    dispatch({ 
     type: UPDATE_PRODUCT, 
     stateOfResidenceId: accountDetails.stateOfResidenceId, 
     product, 
    }); 
    }; 
} 

は基本的にあなたがアクションに必要なすべてのデータを取得し、その後、あなたはあなたの減速にそのデータを送信することができます。

幸運を祈る!

-1

アクションをディスパッチする際に、パラメータを渡すことができます。この場合、アクションにaccountDetails.stateOfResidenceIdを渡し、ペイロードとしてレデューサーに渡すことができます。

3

あなたのオプションは、combineReducersの使用だけでなく、より多くのロジックを書き込むか、アクションにさらにデータを含めることです。 Reduxのよくある質問は、http://redux.js.org/docs/faq/Reducers.html#reducers-share-stateです。

また、私は現在、Reduxドキュメントの「Structuring Reducers」のトピックに関する新しいページセットに取り組んでいます。これは役に立つかもしれません。現在のWIPページはhttps://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/StructuringReducers.mdです。

+0

あなたの答えをありがとう。私はあなたがリンクしているリソースのいくつかを調査しており、引き続きこれを行います。しかし、知識があるように見えるので、あなたに質問してください。別の答えは、「サンク」の使用を示唆した。これが私の問題の良い解決策になると思いますか?それが私のコードを混乱させるか、またはベストプラクティスではない場合、それは私が追求したい解決策ではありませんが、これらの選択肢の長期的影響を判断するのに十分な知識はありません。 – Tylerlee12

+1

これは、副作用を管理し、複数のディスパッチと現在のアプリ状態を使用する複雑なロジックを実行するための標準的なアプローチです。現在のアプリ状態を読み取り、条件付きでディスパッチしたり、複数のアクションをディスパッチしたり、状態の一部を取得したり、ディスパッチされたアクションにそれを含めたりするサンク機能を作成するのは、全く正常です。私は、一般的なサンクパターンの例をhttps://gist.github.com/markerikson/ea4d0a6ce56ee479fe8b356e099f857eに掲載しています。 – markerikson

0

私はあなたをアクションクリエイターに渡すことをお勧めします。あなたは

function mapStateToProps(state, ownProps) { 
    return { 
    stateOfResidenceId: state.accountdetails.stateOfResidenceId 
    } 
} 

を使用して接続することができ、あなたが反応し使用していると仮定し、アクションをトリガーする場所で

updateProduct(arg1, arg2, stateOfResidenceId) { 
    return { 
    type: UPDATE_PRODUCT, 
    stateOfResidenceId 
    } 
} 

: だから、どこか、あなたはこのような何かをするアクションの作成者を持っていますreact-reduxの接続を使用して反応コンポーネントに接続します。

connect(mapStateToProps)(YourReactComponent); 

さて、あなたはあなたがアクションupdateProductをトリガーするコンポーネントを反応させるには、あなたが小道具としてstateOfResidenceIdを持つべきである、とあなたは、アクションの作成者に渡すことができます。

それは複雑に聞こえますが、それは本当に懸念の分離です。

0

あなたは、使用しようとすることができます:

const localState1 = getState(reducerA.state1) 
const localState2 = getState(reducerB.state2) 
関連する問題