2017-07-01 8 views
0

私は、combinedReducerのレデューサーの1つからreduxの全アプリケーション状態ツリーをオーバーライドしたいユニークなユースケースを持っています。目的は、アプリケーションの別のセッションをロードできるようにすることです(保存ボタンのように)。reactxの状態ツリーを上書きする

しかし、私はこれについてどうやって行くのかわかりません、getStateから状態全体を簡単に取得して保存することはできますが、それを設定するものはないようです。私もredux-persistを調べてみましたが、どのようにしてPersisterオブジェクトを別のコンポーネントに渡すかはあまりよく分かりません。

ヒントや手掛かりはありますか?ありがとう

答えて

3

高次減速機を使用して、アプリの状態全体を置き換えることができます。

Higher Order Reducer

このリンクを参照してください。

この疑問がある場合は、コメントにお尋ねください。

const {combineReducers, createStore} = require('redux'); 

function todos(state=[], action){ 
    switch (action.type) { 
     case 'ADD_TODO': 
      return [...state, action.data]; 
     default: 
      return state; 
    } 
} 

var state = { 
    todos: ['todo1'] 
} 

var reducers = combineReducers({ 
    todos: todos 
}); 

var store = createStore(HigherOrderReducer(reducers), state); 

function HigherOrderReducer(reducers, initialState){ 
    let higherState = { 
     state: initialState 
    } 
    return function(state = {}, action){ 
     switch (action.type) { 
      case 'REPLACE_WHOLE_STATE': 
       higherState.state = action.data; 
       return higherState.state; 
      default: 
       return reducers(state, action); 
     } 
    } 
} 

store.subscribe(function(){ 
    console.log(store.getState()); 
}) 

store.dispatch({ 
    type: 'ADD_TODO', 
    data: 'todo2' 
}) 

var newState = { 
    todos: ['task1', 'task2'] 
} 

store.dispatch({ 
    type: 'REPLACE_WHOLE_STATE', 
    data: newState 
}) 
+0

今、私はcombineReducerを使用しています。個々の減速機は状態の異なる部分を制御します。しかし、減速機Bに減速機Aが変化している状態を変更させる方法を明確にしていない。 – Leon

+0

私はちょうど私の答えの例を追加します。あなたがdobutsを持っていれば、コメントで尋ねる。 – Vasi

+0

作品かどうか – Vasi

1

還元剤自体の状態全体を交換できるはずです。だから、object.assign({}, state, {...})のようなことをするのではなく、ちょうどreturn newStateになります。

実行しようとしているのは、ルートレデューサーレベルから状態を完全に置き換えることであれば、結合した状態に基づいて条件を書くことができます。

combineReducer(AReducer, BReducer, (CReducer.someCondition? CReducer : DReducer)) 

これはすべてjavascriptです。これに代わる方法は、削減レデューサーを使用して、選択したレベル(ルートレデューサーまたはレデューサー)でマージして新しい状態を生成することです。

+0

うーん、私はそれがすべてどのように機能するのか完全に理解していません。 私のアプリでは、私はAReducerとBReducerをアプリのさまざまな部分に対応させています。私の理解から、それらのコンポーネントの状態ツリーを制御しています。 変更したい各状態で、その3進CReducer.someConditionを使用する必要がありますか? – Leon

+0

はい。私の例の考え方は、CReducerのいくつかの状態に基づいてCReducerまたはDReducerのいずれかを表示するために使用するということです。あなたは同じ一般的なアルゴを複数回使用することができますが、それはclunkyになるかもしれません。私はcombinereducersを使用することをお勧めし、それをよりclunkyにするために減速機を減らす。そのようなソリューションは、特定の状況に大きく依存します。 – Louis

関連する問題