見出し画像

【React】ライフサイクルメソッドと副作用フック


はじめに

開発エンジニアのAKIHISAです!
先日鉄フライパンを購入してから料理が楽しくて仕方がありません!
じっくりと油の染みた鉄フライパンに育て上げたいと思います…!!
さて、本題ですが最近個人的にReactの学習をしており、アウトプットとして記事を書きました。
フロントエンドの概念は画面ありきなので、今まで学習していた様なバックエンドのロジックメインの概念とはかなり異なっているので苦戦しています。。。
初めての投稿と言うこともあり文章に拙いところもあるかと思いますが、興味がある方は是非ご覧いただけたらと思います!

今回はReact公式ドキュメントの副作用フックで学習したことをアウトプットしたいと思います。

ライフサイクルメソッド

まず概念を抑えるためにクラスコンポーネントにおけるライフサイクルメソッドを紹介いたします。
そもそもライフサイクルとはどういう意味でしょうか。
広辞苑ではライフサイクルの定義は以下のように記されています。

"ライフ‐サイクル【life cycle】
①誕生から死までの、人の一生の過程。「―を考えた貯蓄」

一方、Reactで言うライフサイクルは、Reactコンポーネントが生成され(Mount)、更新(Update)していく中で最終的にはコンポーネントが削除(Unmount)されるまでのフローのことを表します。
例えば毎秒時刻を更新するコンポーネントをDOMに挿入する場合であれば、各々以下のような挙動となります。

Mount: 画面に現在時刻表示が表示される
Update: 現在時刻の更新が行われる
Unmount: 画面から現在時刻表示が削除される

これをメソッドとして定義したものがライフサイクルメソッドと呼ばれ、以下の3つを主に使用します。

  • componentDidMount

    • コンポーネント生成時に一回のみ実行

    • イベントリスナーやAPI通信の接続等の初回設定、DOMに対する処理等の毎回実行するものを記述する

  • componentDidUpdate

    • コンポーネント更新時に毎回実行

    • DOMに対する処理等毎回実行するものを記述する

  • componentWillUnmount

    • コンポーネント破棄時に実行

    • イベントリスナーやタイマー等の解除、API通信の切断を行う

副作用フック

次に、現在では標準標準となっている、フックから、副作用フックを紹介します。

フック(hook)は、React 16.8で追加された機能で、今までクラス内でしか使えなかったReactの機能をクラスを書かずに使えるようにしたものです。

フックのuseEffectメソッドを使用することにより、上記ライフサイクルメソッドを代替的に実現することができます。
useEffectでは、componentDidMountのようにコンポーネント生成時のみに処理を実行したり、componentDidUpdateのように更新があるたび処理を実行、componentWillUnmmountのようにコンポーネント破棄時に処理を実行したりすることができます。
それでは以下よりuseEffectを使用してみましょう。
まず、ReactからuseEffectをインポートします。

import { useEffect } from 'react';

次にcomponentDidUpdateに対応する、更新時に毎回処理を行う構文を記述します。

useEffect( () => {
    // 毎回実行する処理
});

こちらは画面がレンダリングされる度、useEffectの中身の処理が毎回実行されます。
次にcomponentDidMountに対応する、マウント時に一回だけ処理を行う構文を記述します。

useEffect( () => {
    // 初回のみ実行する処理
}, []);

useEffectの第二引数に空の配列を渡すと、初回のみ処理が実行されます。

useEffectの第二引数に渡した配列の中に変数を格納した場合、画面が再レンダリングさる度に渡した変数の値を確認し、前回と値が違っていれば中身の処理が行われるようになります。
これにより、画面が再レンダリングされる度に行われていた変更のない処理を行う必要がなくなり、関数自体も分けることができるようになります。
関数自体がお互いに影響を与えず、それぞれの関数で関連するロジック毎に分けることを関心の分離と言います。

最後にcomponentWillUnmountに対応する、アンマウント時にクリーンアップを行うための構文を記述します。

useEffect( () => {
    // 毎回行う処理
    return (
        // クリーンアップ処理
    );
});

アンマウントを行う際に副作用のクリーンアップを行います。
コンポーネントを破棄する時の動作なので、主にメモリの解放処理を行います。
こちらの処理はアンマウント時の他に更新時にも呼ばれます。

まとめ

  • ライフサイクルとは、Reactコンポーネントが生成され、更新されていく中で最終的には削除される一連の流れのことを言う。

  • フックのuseEffectメソッドではライフサイクルメソッドと同様の処理を一つの関数内で行うことができる。

useEffectはライフサイクルメソッドと比較しても多くの機能を持った関数となりますが、本記事で紹介した内容が基本となります。
参考資料に記載しているサイトではさらに詳しい内容が載っていますので、ぜひご覧ください。

参考資料


この記事が参加している募集