2016-07-13 18 views
1

還元状態の計算値を現在の状態に基づいてどのように実装する必要がありますか?redux計算された値を取得または格納する方法

私は例てsessionState

const defaultState = { 
    ui: { 
    loading: false 
    }, metadata: { }, 
    data: { 
    id: null 
    } 
} 

export default function sessionReducer(state = defaultState, action) { 
    switch(action.type) { 
    case STORE_DATA: 
    return _.merge({}, state, action.data); 
    case PURGE_DATA: 
    return defaultState; 
    default: 
    return state; 
    } 
} 

言ってやる例えば、私はセッションがログインしている場合には取得したい、私は通常、今それをチェックすることsessionState.data.idあるんが、私はどのように知りたいのためにこれを持っています私はsessionState.loggedInか何かできますか?

これは可能ですか?

const defaultState = { 
    ui: { 
    loading: false 
    }, metadata: { }, 
    data: { 
    id: null 
    }, 
    loggedIn:() => { 
    this.data.id 
    } 
} 

または何か(テストされていない、それを投げただけ)。この例では、単に.data.idと書くだけで簡単ですが、すでに計算が行われている場合は、同じ計算を別のファイルに書き込むことは好ましくありません。

+4

を[再選択](https://github.com/reactjs/reselect)を見てください。 –

答えて

2

状態オブジェクトにメソッドを追加することは悪い考えです。状態は普通のオブジェクトでなければなりません。いくつかのライブラリは、すべての突然変異時にアプリの状態をシリアル化することを覚えておいてください。

状態オブジェクトの外に計算機能を作成することができます。彼らは議論として州を受け取ることができます。なぜ彼らは国家の方法であるべきですか?

const defaultState = { 
    ui: { 
    loading: false 
    }, metadata: { }, 
    data: { 
    id: null 
    } 
} 


const loggedIn = (state) => { 
    //your logic here 
} 
1

計算された結果は非常に簡単で計算が速く、毎回オンデマンドで計算することができます。これは@Lazarevのように計算する関数をどこかで定義するのを簡単にします。

しかし、計算が複雑で時間がかかる場合は、結果をどこかに保存して再利用できるようにします。このデータを状態にすることは、状態を非正規化するため、良い考えではありません。

状態は不変であるので、幸いなことに、あなたは結果を計算し、その後、あなたは結果をキャッシュするmemoizationを使用することができ、簡単な純粋な関数を書くことができます。

const isLoggedIn = memoize(state => state.login.userName && state.login.token && isValidToken (state.login.token)); 

最後に、あなたは上のメソッドを使用する場合お店の状態、あなたはRedux Schema(免責事項:私はそれを書いた):使用することができます

const storeType = reduxSchema.type({ 
    ui: { 
    loading: Boolean 
    }, metadata: { }, 
    data: { 
    id: reduxSchema.optional(String) 
    }, 
    loggedIn() { 
    return Boolean(this.data.id); 
    } 
}); 
+0

私は完全に同意します。ただし、不変のデータ構造のために書かれた 'memoize'ライブラリがあることを除けば、https://github.com/louisremi/memoize-immutable –

関連する問題