2017-10-08 20 views
1

特定のレデューサーの現在の状態を、すべてのアクションで明示的に呼び出さずにセッションストレージに保存したいとします。Reduxレデューサーオン状態の変更

const { handleActions } = require("redux-actions"); 

// How do i make this logic run on any state change without adding it to every action? 
const onStateChange = (state) => sessionStorage.save(keys.myReducer, state); 

const myReducer = handleActions 
({ 
    [Actions.action1]: (state, action) => (
     update(state, { 
      prop1: {$set: action.payload}, 
     }) 
    ), 
    [Actions.action2]: (state, action) => (
     update(state, { 
      prop2: {$set: action.payload}, 
     }) 
    ) 
}, 
//****************INITIAL STATE*********************** 
{ 
    prop1: [], 
    prop2: [] 
} 
); 

特定のレデューサーの状態変更イベントをキャッチする方法はありますか?

私は

おかげで

+0

[redux-localstorage](https://github.com/elgerlambert/redux-localstorage)や[redux-persist](https://github.com/rt2zz/redux-persist)のようなライブラリを試しましたか?あるいは、これらのライブラリが扱っていないニッチなユースケースに取り組んでいますか? – excalliburbd

+0

@excalliburbd - 状態の変更を実行する唯一のロジックではないので、残念ながらこれで問題は解決しません – Daniel

答えて

3

残念ながら、あなたの店ので、お店の特定の部分を見ることができない特定の減速の変化に聞いて話して、私はstore.subscribeの知っているが、それは全体の店舗のためです実際は唯一の減速機です(combineReducersは単一の大きな減速機を返します)。それは、状態部品の比較を行うことによって減速機が変更されたかどうかを手動で確認できると述べています。それらが発射されるときは、特定のアクションをリッスンし、店を存続(およびその他のlogiceを行う)ためにredux-sagaを使用することができます

let previousMyReducer = store.getState().myReducer; 
store.subscribe(() => { 
    const { myReducer } = store.getState(); 
    if (previousMyReducer !== myReducer) { 
    // store myReducer to sessionStorage here 
    previousMyReducer = myReducer; 
    } 
}) 
+0

参照による比較は有効ですか?値が変更された場合、レジューサーの参照変更を行います(変更のみ)。 – Daniel

+1

はい、減速機の不変性の主な利点は、減速機が同じ状態の参照が返されるときに返されます – Freez

0

。これはあなたのニーズに適しているようです。

特定のストアの変更に拘束されるのではなく、一連のアクションに関連付けられています。しかし、私はこのモデル(状態の変化とは対照的に、行動を聞いている)は、レデックスデザインにとってより適していると思います。

すてきなことは、サガ以外のコードを変更する必要がないことです。私はフォームデータのオートセーブにこれを使用しました。

ここでは、いくつかのレピュックス形式のアクションでサガを維持するように設定する例を示します。これは永続することに限定されないことに注意してください。あなたはサガの中で何でもしたいことができます。

yield takeLatest(
    '*', 
    saveFormValues, 
    apiClient); 

の詳細:あなたはすべてのアクションタイプを聴いたり、アクションがあなたの永続コードを発射そのうちカスタムフィルタリングを行いたい場合は

function* autosaveSaga(apiClient) { 
    yield throttle(500, 
    reduxFormActionTypes.CHANGE, 
    saveFormValues, 
    apiClient); 

    yield takeLatest(
    reduxFormActionTypes.ARRAY_PUSH, 
    saveFormValues, 
    apiClient); 

    yield takeLatest(
    reduxFormActionTypes.ARRAY_POP, 
    saveFormValues, 
    apiClient); 
} 

、あなたはtakeLatestに、パターン、またはマッチング関数を渡すことができますtaketakeLatestなどに渡すことができるものはin the docs for takeです。

+0

ありがとう、それは私が避けようとしているものです。(同じ行を書くすべての行動に) – Daniel

+0

私の例は最適ではありません。パターンを使用したり、すべてのアクションに一致することができるように更新されました。 – stone

関連する問題