0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Reactのprevと...prevって何?初心者がつまずきやすいポイントをわかりやすく解説

Posted at

はじめに

こんにちは。IT経験1年半の駆け出しです。
今回はReactの状態管理でよく見る

setState(prev => ({
  ...prev,
  email: "test@example.com"
}));

というコードに出てくる「prev」「...prev」について、初心者の方向けにやさしく解説していきます。

なぜprevを使うのか?

Reactで状態(state)を更新する際、こんな書き方を見たことはありませんか?

setCount(prev => prev + 1);

「え、普通に setCount(count + 1) じゃダメなの?」と思う方もいるかもしれません。
実は、Reactの状態更新は非同期でまとめて処理されるため、countの値がすでに古くなっている可能性があります。

よくある間違い

setCount(count + 1);
setCount(count + 1); // → 実際は1しか増えない!

正しい書き方

setCount(prev => prev + 1);
setCount(prev => prev + 1); // → ちゃんと2増える!

prevは「直前の最新状態」を参照できる特別な書き方。これによって、正確な状態の積み重ねが可能になります。

...prevって何?

次によく出てくるのが、...prevという書き方。これはスプレッド構文と呼ばれるJavaScriptの機能で、オブジェクトの中身を展開・コピーするものです。
例:フォームの一部だけを更新したいとき

const [form, setForm] = useState({
  name: "",
  email: ""
});

setForm(prev => ({
  ...prev,
  email: "test@example.com"
}));

このコードの意味を分解すると:

  1. prev は前回の form の状態({ name: "", email: "" })
  2. ...prev でその内容をまるごとコピー
  3. そのうえで email だけを "test@example.com" に上書き
    つまり、元の情報は保ちつつ、一部だけを更新するというやり方です。
    ...prevを使わないとどうなる?
setForm({ email: "test@example.com" });

これだと、name の情報が消えて、formの中身がemailだけになります。

なぜ...prevが必要?

ReactのuseStateでオブジェクトを更新する場合、部分更新は自動では行われません。
そのため、「上書きしたい項目以外」もすべて保持するように明示する必要があります。

setForm(prev => ({
  ...prev,
  email: "test@example.com"
}));

この書き方を覚えておけば、フォームの値や設定などの一部だけを変更するのにとても便利です。

まとめ

用語 意味・役割
prev 前回の状態の値を受け取る引数
...prev 前回の状態をスプレッド構文でまるごとコピー
prev => prev + 1 状態更新を確実に積み重ねるための書き方
...prev, email: "..." オブジェクトの一部だけを更新する基本テク

おわりに
初心者がReactの状態管理でつまずきやすい「prev」と「...prev」。
意味を理解すると、複雑なUIでも安心して状態を更新できるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?