2017-04-03 11 views
0

2つのクラス成分と、両方の成分で使用される単一のレデューサーをmapStateToPropsと書きました。複数の成分用の単一レデューサーの作成

コンポーネント減速DEF:DEF

import notify from '../global/reducers/notifyReducer'; 

const compAReducer = combineReducers({ 
    notify 
}); 

export default compAReducer; 

コンポーネントBの減速:

import notify from '../global/reducers/notifyReducer'; 

const compBReducer = combineReducers({ 
    notify 
}); 

export default compBReducer; 

が減速は次のようになります。

import * as types from '../../../actions/actionTypes'; 

export default function notifyReducer(state = {}, action) { 
    switch (action.type) { 
     case types.NOTIFY_SUCCESS: 
     case types.NOTIFY_FAILURE: 
      return action.notify; 
     case types.NOTIFY_NULL: 
      return {}; 
     default: 
      return state; 
    } 
} 

問題は、そのときcompnentのAディスパッチですアクション、それはコンポーネントB、副詞の状態に影響します。

これは私が探している動作ではありません。私は、コンポーネントが同じロジックを使用するが、別の "状態プロパティ"を保持することを望む。 異なる「通知」インスタンス。

還元剤を複製することはできますか?

ありがとうございます。私はまだReact-Reduxを学んでいます。

答えて

3

各コンポーネントにIDを付けることで、状態の名前空間を割り当てることができます。

export function notifyReducer(state = {}, action) { 
    switch (action.type) { 
     case types.NOTIFY_SUCCESS: 
     case types.NOTIFY_FAILURE: 
      return { ...state, [action.id]: action.notify }; 
     case types.NOTIFY_NULL: 
      return { ...state, [action.id]: {} }; 
     default: 
      return state; 
    } 
} 

次にあなたがする必要があるすべては、あなたのコンポーネントがディスパッチ各アクションでidプロパティが含まれていることを確認しています。

アプリケーションによっては、コンポーネントの各インスタンスに関連付けられた論理IDが既に存在する場合があります。そうでなければ、コンストラクタ内でランダムなIDを生成できます。

import uid from 'uid'; 

constructor() { 
    super(this); 
    this.id = uid(); 
} 

その後、あなたの行動のクリエイターの各パラメータとしてidを受け入れる必要があります。

function notifyFailure(id, notify) { 
    return { id, type: types.NOTIFY_FAILURE, notify } 
} 

最後に、mapDispatchToPropsのIDを渡す必要があります。

function mapDispatchToProps(dispatch) { 
    return { 
    notifyFailure(id, notify) { 
     dispatch(notifyFailure(id, notify)); 
    } 
    } 
} 

ご希望の場合は、bindActionCreatorsをご利用ください。

+0

回答ありがとうございますが、実際には動作しません。両方のコンポーネントで更新が進行中であることを示しています(アクションをディスパッチした後も同じIDを保持しています)。 また、メッセージの表示のための単純な文字列であることを通知する前に、IDをキーとし、値として文字列を持つオブジェクトです。宣言的ではなく、かなり奇妙です。 私はそれについてもっと読むでしょう。ありがとう – Chen

+0

ちょっとだけデータが複雑であるということは、もはや宣言的ではないという意味ではありません。あなたが望むほどシンプルではないかもしれませんが、idを持つオブジェクトにデータをラップすることはまったく奇妙ではありません。 –

+0

このアプローチには、多くのメリットがあります。しかし、私は国家をシンプルなままにしておきたいと思っていました。私は、国家の鏡としての見方をしようとしています。 notifyのメッセージは単に文字列でなければなりません。 実際に私はカスタマイズされた高次を使って解決しました。reduce: http://redux.js.org/docs/recipes/reducers/ReusingReducerLogic.html これで、追加の識別子を追加することなく、状態の特定の領域をターゲットにすることができますそれ(実際の店舗レベルで) – Chen

0

は、最終的に高次の減速が近づいて行きました:

You can read about it here

インポート* ../../「から型として../ actions/actionTypes ';

export default function createNotifyReducerWithPageType(pageType = '') { 
    return function notifyReducer(state = '', action) { 
     switch (action.type) { 
      case types.NOTIFY_SUCCESS + `_${pageType}`: 
      case types.NOTIFY_FAILURE + `_${pageType}`: 
       return action.notify; 
      case types.NOTIFY_NULL: 
       return {}; 
      default: 
       return state; 
     } 
    } 
} 

アクションクリエイター:

export function notifySuccess(notify, type) { 
    return { 
     type: types.NOTIFY_SUCCESS + type, 
     notify 
    } 
} 

export function notifyFailure(notify, type) { 
    return { 
     type: types.NOTIFY_FAILURE + type, 
     notify 
    } 
} 

レデューサー:

import createNotifyReducerWithPageType from '../global/reducers/notifyReducer'; 

const compA = combineReducers({ 
    notify: createNotifyReducerWithPageType('_compA') 
}); 

export default compA; 

と第二1:

import createNotifyReducerWithPageType from '../global/reducers/notifyReducer'; 

const compB = combineReducers({ 
    notify: createNotifyReducerWithPageType('_compB') 
}); 

export default compB; 

だから今州の構造のように、同じですアクションクリエイターがディレクティブを世話する行動をとる。

関連する問題