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?

More than 1 year has passed since last update.

React useEffect で無限ループを避ける方法

Posted at

無限ループする例

Qiita-gif用.gif

useEffect 内で state を更新しているため、無限ループになる。

App.js
import { useEffect, useState } from "react";

export default function App() {
  const [count, setCount] = useState(0);
  const [boolean, setBoolean] = useState(false);

  useEffect(() => {
    setBoolean(true);
    setCount(count + 1);
  });

  return (
    <div>
      <p>Boolean is {boolean.toString()}.</p>
      <p>Count is {count}.</p>
    </div>
  );
}

無限ループを避ける方法

useState の第二引数に、値が変化したときにレンダリングしてほしい state の配列を指定する。

これはよくある要求なので、useEffect フックの API にはこの動作が組み込まれています。再レンダー間で特定の値が変わっていない場合には副作用の適用をスキップするよう、React に伝えることができるのです。そのためには、useEffect のオプションの第 2 引数として配列を渡してください。

App.js

import { useEffect, useState } from "react";

export default function App() {
  const [count, setCount] = useState(0);
  const [boolean, setBoolean] = useState(false);

  useEffect(() => {
    console.log(boolean);
    setBoolean(true);
    setCount(count + 1);
  }, [boolean]);

  return (
    <div>
      <p>Boolean is {boolean.toString()}.</p>
      <p>Count is {count}.</p>
    </div>
  );
}

参考記事

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?