Solved
setTimeoutの中でuseStateの値を更新しても古い値のまま
Taro · 5/30/2026 · 12 views
Reactでカウントアップ機能を作っています。setTimeoutの中でsetCount(count + 1)を呼んでいるのですが、何度実行しても1しか増えません。なぜでしょうか?
Taro · 5/30/2026 · 12 views
Reactでカウントアップ機能を作っています。setTimeoutの中でsetCount(count + 1)を呼んでいるのですが、何度実行しても1しか増えません。なぜでしょうか?
それは典型的な「stale closure(古いクロージャ)」の問題です。setTimeoutのコールバックが生成された時点のcountの値をずっと参照し続けてしまうので、毎回同じ値に+1しているだけになります。
解決策はsetCountに関数を渡す形にすることです。
setCount(prev => prev + 1)
こうすればReactが最新のstateを引数として渡してくれるので、クロージャの古い値を参照する問題を回避できます。setInterval等、非同期処理の中でstateを更新するときはほぼ必ずこの関数型の更新を使うと覚えておくと安全です。
✓ This question has been solved