やさしいReact入門⑨

useEffectの依存配列を理解しよう React

useEffectの依存配列を理解しよう

前回の記事では、useStateを使ってStateを管理する方法について、詳しく見ていきました。

今回は、useEffectについてもう少し詳しく見ていきましょう。

useEffectを使っていると、次のようなコードをよく見かけます。

useEffect(() => {
  fetchData();
}, []);

ここで気になるのが、最後にある[]ではないでしょうか。

これは依存配列と呼ばれるもので、useEffectが「いつ実行されるのか」を考えるうえで重要な部分です。

この記事では、

  • 依存配列とは何なのか
  • []を指定するとどうなるのか
  • [id]のように値を指定するとどうなるのか
  • useStateやuseEffectを複数使う場合

といった内容を、実際のコードを見ながら理解していきましょう。


useEffectの依存配列とは?

さて、以下のuseEffectを見てみましょう。

useEffect(() => {
  fetchData();
}, []);

最後に、[]があります。

これは依存配列と呼ばれるものです。

依存配列には、

このuseEffectが、どの値の変更に反応するのか

を指定します。

[]の場合

例えば、

useEffect(() => {
  fetchData();
}, []);

のように空の配列を指定した場合、

初回のレンダー後に実行され、その後の再レンダーでは実行されません。

そのため、

コンポーネントが表示されたときに、一度だけAPIからデータを取得したい

といった処理でよく利用されます。

idを指定するとどうなる?

次のコードを見てみましょう。

useEffect(() => {
  fetchData(id);
}, [id]);

今度は、[id]となっています。

これは、

idが変わったら、このuseEffectをもう一度実行する

という意味になります。

例えば、ユーザーIDを使ってユーザー情報を取得する場合を考えてみましょう。

  1. id = 1
  2. ユーザー1の情報を取得

その後、

  1. id = 2
  2. ユーザー2の情報を取得

というように、idが変更されたタイミングでAPI通信を行えます。


依存配列は「いつ実行するか」を考える

useEffectを使うときは、

この処理は、いつ実行したいのか?

を考えることが重要です。

例えば、

useEffect(() => {
  fetchData();
}, []);

なら、

初回にデータを取得したい

という意図があります。

一方、

useEffect(() => {
  fetchData(id);
}, [id]);

なら、

idが変わったらデータを取得したい

という意図があります。

依存配列を適切に設定しないと、

  • API通信が必要以上に発生する
  • 処理が何度も実行される
  • 意図したタイミングで処理されない

といった問題につながることがあります。

そのため、

このuseEffectは、何が変わったら実行するのか?

を意識するようにしましょう。


useStateとuseEffectは複数使える

一つのコンポーネントの中で、useStateやuseEffectを複数使うこともできます。

例えば、

const [name, setName] = useState("");
const [age, setAge] = useState(0);

useEffect(() => {
  // nameに関する処理
}, [name]);

useEffect(() => {
  // ageに関する処理
}, [age]);

このように、管理するデータや処理ごとに分けることができます。

ただし、コンポーネントが大きくなってきて、コードが複雑になってきた場合は注意が必要です。

その場合は、

  • コンポーネントを分割する
  • 処理を別の関数に分ける
  • カスタムHookを利用する

といった方法があります。

「カスタムHook」という仕組みもReactでは重要ですが、これはもう少しReactに慣れてから学んでも問題ありません。

まずは、

一つのコンポーネントにすべての処理を詰め込まない

という考え方を覚えておきましょう。


まとめ

今回は、useEffectの依存配列について詳しく見ていきました。

依存配列には、useEffectがどの値の変更に反応するのかを指定します。

例えば、

  • [] → 初回のレンダー後に実行する
  • [id] → idが変わったときに実行する

というように、依存配列によってuseEffectを実行するタイミングを指定できます。

また、useStateやuseEffectは、一つのコンポーネントの中で複数使うこともできます。

大切なのは、

このuseEffectは、何が変わったら実行するのか?

ということを意識することです。

ここまで理解できれば、useEffectが「なんとなく書くもの」から、「いつ、どんな処理を実行したいのかを考えて使うもの」へと少しずつ変わってくると思います。


管理人そーそー。が在籍中の会社は👉こちら👈

みんな仲が良くて、大好きな会社です☺️

無料で参加できるエンジニア交流Barもやってるので、気軽に遊びにきてください!

コメント

タイトルとURLをコピーしました