[解決済み】setInterval内でReactのstateフックを使用するとstateが更新されない。
2022-04-14 10:17:30
質問
新しい Reactフック そして、毎秒増加することになっているカウンターを持つClockコンポーネントを持っています。しかし、値が1より大きくなることはありません。
function Clock() {
const [time, setTime] = React.useState(0);
React.useEffect(() => {
const timer = window.setInterval(() => {
setTime(time + 1);
}, 1000);
return () => {
window.clearInterval(timer);
};
}, []);
return (
<div>Seconds: {time}</div>
);
}
ReactDOM.render(<Clock />, document.querySelector('#app'));
<script src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<div id="app"></div>
解決方法は?
の中に渡されたコールバックが原因です。
setInterval
のクロージャにアクセスするだけです。
time
変数にはアクセスできず、最初のレンダリングにある新しい
time
の値は、次のレンダリングで
useEffect()
は2回目には呼び出されない。
time
の中では、常に0という値になっています。
setInterval
のコールバックがあります。
と同様に
setState
ステートフックには、更新された状態を取り込む形式と、現在の状態が渡されるコールバック形式があります。2番目の形式を使用し、最新の状態の値を
setState
コールバックを使用して、インクリメントする前に最新の状態値があることを確認します。
ボーナス:別のアプローチ
ダン・アブラモフ氏による、「SkyDesk」「SkyDesk」「SkyDesk」の使い方についての徹底解説です。
setInterval
の中でフックを使っています。 ブログ記事 と、この問題を回避するための代替方法を提供しています。ぜひご一読ください。
function Clock() {
const [time, setTime] = React.useState(0);
React.useEffect(() => {
const timer = window.setInterval(() => {
setTime(prevTime => prevTime + 1); // <-- Change this line!
}, 1000);
return () => {
window.clearInterval(timer);
};
}, []);
return (
<div>Seconds: {time}</div>
);
}
ReactDOM.render(<Clock />, document.querySelector('#app'));
<script src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<div id="app"></div>
関連
-
[解決済み】GETできない / Nodejsエラー
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] scriptタグの中にCDATAセクションが必要なのはどんな場合ですか?
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み] useEffect React Hook使用時の依存性欠如の警告を修正する方法
-
[解決済み] Reactでネストした状態のプロパティを更新する方法
-
[解決済み] Reactで親の状態を更新するにはどうしたらいいですか?
-
[解決済み] React Hook useEffectの非同期関数に関する警告:useEffect関数はクリーンアップ関数か何も返さないこと
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
vueにおけるv-forループオブジェクトのプロパティ
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】「X-Frame-Options」を「SAMEORIGIN」に設定したため、フレームでの表示を拒否された。
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
nullのプロパティinnerHTMLを読み取れません エラーメッセージ