はじめに
Next.js
で開発中に、useEffect
の使用に関してエラーが発生しました。本記事ではその原因と解決方法についてまとめます。
この記事は個人的なアウトプットを目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです。
現象
以下のようなコードを書いたところ、React Hooks
に関するエラーが発生しました。
//省略
if (error) {
return <div>エラーが発生しました</div>;
}
useEffect(() => {
if (videos) {
setFilteredData(videos);
}
}, [videos]);
このように、if
文の後にuseEffect
を書いただけでエラーになってしまいます。
原因
React Hooks
(useEffect
, 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