●目次
Reactで状態(state)を管理する際、以前の状態に基づいて新しい状態を設定したいケースがよくあります。
そこで便利なのがprevState
です。
prevState
とは?
prevState
とは、「前の状態(previous state)」を指し、特に状態更新が非同期で行われるReactの内部処理で、正確な状態を保ちながら新しい状態を設定するために役立つ概念です。
状態を直接変更するのではなく、現在の状態から新しい状態を導く形で使用されるため、prevState
を使うことで複数回の更新があっても安定した動作を期待できます。
prevState
を使う場面と利点
prevStateを使う場面
- カウンターやトグル機能など、複数回状態が変更される操作
- 非同期の状態変更で、前の状態が正確に必要な場合
- 状態が連続して変わる場面で、最後の結果が意図したものになっていない可能性を防ぐ
prevStateを使う利点
prevState
を使うことで、次の利点が得られます。
- 状態の競合を防ぐ
非同期処理であっても、正しい前の状態を参照するため、複数の状態更新が競合することがありません。 - 読みやすいコード
状態を直接更新するのではなく、prevState
を引数にした関数として表現することで、状態管理がより明確になります。
prevState
を使ったカウンターの例
具体的な例として、カウンターコンポーネントを作成してみましょう。
このコンポーネントでは、setCount
関数で状態を更新する際にprevState
を使い、ボタンがクリックされるたびにカウントが増加するようにします。
prevStateを使っていない場合
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
return (
<div>
<p>カウント: {count}</p>
<button onClick={increment}>増加</button>
</div>
);
}
export default Counter;
prevStateを使っている場合
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(prevState => prevState + 1);
};
return (
<div>
<p>カウント: {count}</p>
<button onClick={increment}>増加</button>
</div>
);
}
export default Counter;
- 状態の初期化
useState(0)
を使って、count
の初期状態を0
に設定します。 - increment関数
increment
関数内でsetCount
を呼び出し、引数としてprevState
を受け取っています。prevState
は前の状態を示しているため、prevState + 1
を計算することで現在のカウントに1
を加えた新しい状態を設定します。 - ボタンのクリックで状態が更新
<button>
タグにonClick
イベントを設定し、ボタンをクリックするとincrement
関数が呼び出され、count
が1ずつ増加します。
prevState注意点
prevState
を使う場合、以下の点に注意してください:
prevState
は必ず関数内で使用する
状態更新を行う関数(例:setCount
)の引数としてprevState
を指定する必要があります。- 配列やオブジェクトを扱う場合は浅いコピーを作成する
配列やオブジェクトで状態を更新する場合、元の状態の浅いコピーを作成してから更新することを推奨します。
まとめ
ReactのprevState
は、特に状態が連続的に変わるケースや非同期処理が関わる場面での安定した状態管理に便利な機能です。正しい状態を維持しつつ、新しい状態を確実に反映できるようになるため、複雑なアプリケーション開発において非常に有用です。
今回紹介したカウンターの例を通じて、ぜひprevState
を活用した状態管理に慣れていきましょう!