Redux Reducerでスマートに初期状態を設定:3つの方法とベストプラクティス
Redux Reducerでストアの初期状態を読み取る
Redux Reducerは、Reduxストア内の状態を更新する関数です。Reducerは、アクションを受け取り、それに応じて新しい状態を返します。新しい状態は、ストア内に保存され、コンポーネントによって使用されます。
初期状態の読み取り
Reducerは、initialState
パラメータを使用して、ストアの初期状態を読み取ることができます。initialState
パラメータは、Reducerが最初に呼び出されたときに渡されるオブジェクトです。
例
const initialState = {
count: 0,
};
function counterReducer(state = initialState, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
この例では、counterReducer
は、count
プロパティを持つ初期状態オブジェクトを受け取ります。INCREMENT
アクションがディスパッチされると、Reducerはcount
プロパティを1増やした新しい状態を返します。DECREMENT
アクションがディスパッチされると、Reducerはcount
プロパティを1減らした新しい状態を返します。
initialState
パラメータを使用しない場合
Reducerは、initialState
パラメータを使用せずに実装することもできます。この場合、Reducerは、アクションが最初にディスパッチされたときに渡されるオブジェクトを使用して初期状態を初期化します。
function counterReducer(state = undefined, action) {
if (state === undefined) {
return { count: 0 };
}
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
この例では、counterReducer
は、state
パラメータがundefined
かどうかを確認します。state
パラメータがundefined
の場合、Reducerはcount
プロパティを持つ初期状態オブジェクトを返します。state
パラメータがundefined
ではない場合、Reducerはアクションの種類に基づいて新しい状態を返します。
- テストが容易になる
- デバッグが容易になる
- コードがより読みやすくなる
initialStateパラメータを使用したReducer
const initialState = {
count: 0,
};
function counterReducer(state = initialState, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
このコードは、initialState
パラメータを使用してストアの初期状態を読み取るReducerの例です。initialState
パラメータは、count
プロパティを持つオブジェクトです。
counterReducer
は、state
パラメータとaction
パラメータを受け取ります。state
パラメータは、Reducerの現在の状態です。action
パラメータは、ディスパッチされたアクションです。
function counterReducer(state = undefined, action) {
if (state === undefined) {
return { count: 0 };
}
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
説明
このコードは、initialState
パラメータを使用せずにストアの初期状態を読み取るReducerの例です。
createStore関数を使用したストアの作成
const store = createStore(counterReducer);
このコードは、createStore
関数を使用してストアを作成します。createStore
関数には、Reducerを渡す必要があります。
この例では、counterReducer
がcreateStore
関数に渡されます。これにより、ストアはcounterReducer
を使用して状態を更新します。
コンポーネントからのストアへのアクセス
function Counter() {
const count = useSelector(state => state.count);
return (
<div>
<h1>カウント: {count}</h1>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>インクリメント</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>デクリメント</button>
</div>
);
}
このコードは、ストアのcount
プロパティにアクセスするコンポーネントの例です。
useSelector
フックを使用して、ストアから現在の状態を取得します。useSelector
フックには、状態から値を取得するためのセレクター関数を渡す必要があります。
この例では、state => state.count
というセレクター関数が使用されます。このセレクター関数は、ストアのcount
プロパティを返します。
count
プロパティは、<h1>
タグを使用してレンダリングされます。
increment
ボタンとdecrement
ボタンは、dispatch
関数を使用してアクションをディスパッチします。increment
ボタンがクリックされると、INCREMENT
アクションがディスパッチされます。decrement
ボタンがクリックされると、DECREMENT
アクションがディスパッチされます。
const initialState = {
count: 0,
};
function counterReducer(state = initialState, action) {
// ...
}
この例では、initialState
パラメータはcount
プロパティを持つオブジェクトです。counterReducer
は、state
パラメータにinitialState
オブジェクトのデフォルト値を割り当てます。
利点
欠点
- 特にない
function counterReducer(state = undefined, action) {
if (state === undefined) {
return { count: 0 };
}
// ...
}
- コードが簡潔になる
- テストが難しくなる
上記の方法に加えて、以下の方法でもストアの初期状態を読み取ることができます。
- カスタムロジックを使用する
createStore
関数のオプションを使用する
createStore
関数には、preloadedState
オプションがあります。このオプションを使用して、ストアの初期状態を指定することができます。
const store = createStore(counterReducer, {
count: 0,
});
この例では、createStore
関数にpreloadedState
オプションを渡して、count
プロパティを0に設定します。
上記の方法で説明した方法を使用せずに、カスタムロジックを使用してストアの初期状態を読み取ることもできます。
const initialState = loadInitialState();
function counterReducer(state = initialState, action) {
// ...
}
この例では、loadInitialState
関数を使用して、ストアの初期状態を読み取ります。loadInitialState
関数は、ローカルストレージやAPIから初期状態を読み取るなど、任意のロジックを実装することができます。
Redux Reducerでストアの初期状態を読み取るには、さまざまな方法があります。どの方法を使用するかは、個々の要件によって異なります。
- 特殊な要件がある場合は、
createStore
関数のオプションやカスタムロジックを使用することができます。 - コードが簡潔になる場合は、
initialState
パラメータを使用しない方法がおすすめです。 - コードが読みやすく、デバッグやテストが容易な場合は、
initialState
パラメータを使用するのがおすすめです。
javascript reactjs redux