1
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?

【Next.js】React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.の解決方法

Last updated at Posted at 2025-06-30

はじめに

Next.jsで開発中に、useEffectの使用に関してエラーが発生しました。本記事ではその原因と解決方法についてまとめます。

この記事は個人的なアウトプットを目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです

現象

以下のようなコードを書いたところ、React Hooksに関するエラーが発生しました。

//省略

if (error) {
    return <div>エラーが発生しました</div>;
  }
  
useEffect(() => {
  if (videos) {
    setFilteredData(videos);
    }
  }, [videos]);
  

このように、if文の後にuseEffectを書いただけでエラーになってしまいます。

原因

React HooksuseEffect, useStateなど)は常にコンポーネントのトップレベルで呼び出す必要があります。「if文の中でuseEffectを呼び出しているわけではないのに、なぜエラーになるのか?」と疑問に感じました。

Reactは条件分岐があるだけで呼び出しが条件付きと判断してしまいます。
たとえば下記のような構造と見なされてしまいます:

if (error) {
  // error true のとき
} else {
  useEffect(() => {
    // error false のときだけ実行される
  }, []);
}

解決策

useEffectなどのHooksは必ずコンポーネントのトップレベルで実行されるように配置します。
以下のように、if文よりも前にuseEffectを書くことでエラーは解消されます。

useEffect(() => {
  console.log('Effect');
}, []);

if (error) {
  return <div>Error</div>;
}

終わりに

if文やreturn文の前後でエラーになることがあるので、トップレベルで定義するというルールを意識していきたいです。

参考

『React Hooksはなぜトップレベルに書かないといけないのか。』Qiita

『React Hooksのルールをよく理解しないとハマるエラー対処法』Qiita

1
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
1
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?