ReactとRedux
その両方は、予測可能な方法で実行するために、不変性を備えた純粋な関数を必要とします。
これら2つを守らないと、アプリにバグが発生します。最も一般的なのは、React/Redux
変更を追跡できず、state/prop
変更時に再レンダリングできないことです。
Reactの観点から、次の例を検討してください。
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
状態は、プロパティのみが追加された状態オブジェクトによって保持されます。このアプリはアプリプロパティをレンダリングします。何かが発生したときに常に状態をレンダリングする必要はありませんが、状態オブジェクトで変更が発生したかどうかを確認する必要があります。
このように、エフェクト関数があり、pure function
これを使用して状態に影響を与えます。状態を変更する場合は新しい状態を返し、変更が必要ない場合は同じ状態を返すことがわかります。
shouldUpdate
===演算子を使用して、古い状態と新しい状態が同じであるかどうかをチェックする関数もあります。
Reactの点で間違いを犯すために、実際には次のことができます。
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
effects
関数を使用せずに状態を直接設定することで、間違いを犯す可能性もあります。
function doMistake(newValue) {
this.state = newValue
}
上記は行われるべきではなくeffects
、状態を更新するために関数のみが使用されるべきです。
Reactに関しては、と呼びeffects
ますsetState
。
Reduxの場合:
- Reduxの
combineReducers
ユーティリティは、参照の変更をチェックします。
- React-Reduxの
connect
メソッドは、ルート状態とmapState
関数からの戻り値の両方の参照変更をチェックして、ラップされたコンポーネントが実際に再レンダリングする必要があるかどうかを確認するコンポーネントを生成します。
- タイムトラベルデバッグでは、
pure functions
異なる状態間を正しくジャンプできるように、レデューサーに副作用がないことが必要です。
不純な関数をリデューサーとして使用すると、上記の3つに簡単に違反する可能性があります。
以下はredux docsから直接取られたものです:
これは、渡す関数のタイプであるため、レデューサーと呼ばれArray.prototype.reduce(reducer, ?initialValue)
ます。
減速機が純粋であることは非常に重要です。あなたが減速機の中で決してしてはいけないこと:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
同じ引数があれば、次の状態を計算して返す必要があります。驚く様な事じゃない。副作用はありません。API呼び出しはありません。突然変異なし。単なる計算。
window.getElementById
同じパラメータで同じ機能を実行しているので、などは、副作用に応じて、異なる結果を持つことができます。これは、reduxが失敗する場所です。