React useEffect の理解と使用

React useEffect の理解と使用

React16.8 の新しい useEffec フック関数は、副作用を処理するために使用されます。

いわゆる「副作用」の簡単な例を挙げると、風邪をひいていて薬を飲んでも大丈夫なのに、薬を飲んだ後に体がその薬に対してアレルギー反応を起こす、この「アレルギー」が副作用です。

Reactでは、本来はDOMをレンダリングしてページに表示したいだけなのですが、DOM以外にもデータがあり、このデータを外部データソースから取得する必要があります。「外部データソースを取得する」という処理が副作用です。

useEffect の使い方については、公式サイトに掲載されている例を参考にしてください。ここでは主に useEffect の使用時に発生する問題についてまとめます。

繰り返しレンダリングループを避ける

useEffect を使用して配列を第 2 パラメータとして受け取り、第 2 パラメータを依存関係として使用します。DOM がレンダリングされ、副作用関数が実行されるたびに、依存関係のレンダリング前後の値が一致しているかどうかを確認するための浅い比較が行われます。一致していない場合は副作用が実行され、一致していない場合は実行されません。依存関係が空の配列 [] の場合、つまり比較する変数が渡されていない場合は、比較結果は常に変更されず、副作用ロジックは 1 回しか実行されません。

使用効果(() => {
  タイムアウトを設定する(() => {    
        setCounter(カウンター + 1);  
    }, 300)
}, []);

さらに、更新ボタンをクリックして外部データを取得したいが、無限ループを引き起こしたくない場合は、変数を「スイッチ」として使用して、DOM の循環レンダリングを回避しながら目的を達成できます。

アニメ絵を描くのは面倒なので注釈を読んで想像力を働かせてください😂

function App() { const [count, setCount] = useState(0); const [loading, setLoading] = useState(true); // スイッチとしてロードします useEffect(() => { if (loading) { // これはロードが true の場合にのみ実行されることに注意してください setTimeout(() => { setCount(count + 1); setLoading(!loading); // ロード値を変更します }); } }, [loading]); // ここではロードが依存関係として使用されます
  // 最初の DOM レンダリングが完了した後、loading が true になり、副作用関数が実行され、count 値が 1 になり、loading が false になります。// state の値が変更されるため、更新され、コンポーネントが再度レンダリングされますが、この時点では loading が false であり、setTimeout は実行されません。
  // ループを回避する // [更新] をクリックすると、読み込みが false から true に変わり、関数は更新を実行します
  // DOM が更新された後、useEffect が実行されます。loading がすでに true になっているため、副作用関数が実行でき、count が 1 から 2 に変わります。
  // ロードすると true から false に変わります。 。 。
  return ( <div> <h3>{count}</h3> <button onClick={() => { setLoading(true); }} > 更新 </button> </div> );}

副作用の除去について

useEffect は副作用をクリーンアップする関数を返すことができます。

  使用効果(() => {    
    ChatAPI.subscribeToFriendStatus(props.id、handleStatusChange);  
    関数クリア(){
        ChatAPI.unsubscribeFromFriendStatus(props.id、handleStatusChange);
    }  
    クリアを返す;
});

これには、useEffect の実行と破棄のプロセスが含まれます。

  1. props.id = 1 を渡す
  2. コンポーネントレンダリング
  3. DOMレンダリングが完了し、副作用関数が実行され、clear副作用関数clearが返されます。名前はclear1です。
  4. props.id=2 を渡す
  5. コンポーネントレンダリング
  6. DOMレンダリングが完了したら、clear1を実行します。
  7. 副作用関数が実行され、clear2という名前の別のクリア関数が返されます。
  8. コンポーネントが破壊され、clear2 が実行されました

このことから、副作用クリーンアップ関数の特性を推測できます。

  • 各副作用の実行はクリーンアップ関数を返す
  • クリーンアップ関数は、次の副作用関数が実行される前に実行されます(DOMレンダリングが完了した後)。
  • コンポーネントの破棄ではクリーンアップ関数も実行される

出力されたカウント値から、次の副作用関数が実行される前にクリア関数が実行されることもわかります。つまり、クリア関数のカウント値は最後のキャッシュのカウント値です。

さらに考えてみると、clear1 を実行すると props.id にアクセスされるので、この id の値は 1 でしょうか、それとも 2 でしょうか?

これにはクロージャの概念が関係します。useEffect は関数を返し、この関数は実行時にクロージャを生成するからです。クロージャの定義によれば、返された clear 関数は自身のスコープ外の変数にアクセスできます。コンポーネントが初めてレンダリングされるときに id=1 が渡され、clear 関数の props.id の値は 1 になります。

以上がReact useEffectの理解と使用に関する詳細な内容です。React useEffectについてさらに詳しく知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • ReactのuseEffectクロージャの落とし穴についての簡単な説明
  • React における useEffect と useLayoutEffect の違い

<<:  MySQL データベース開発仕様 [推奨]

>>:  Linux で SSH 経由でリモート ファイルシステムをマウントする方法の詳細な説明

推薦する

VMware および CentOS システムのインストール方法 - ルート パスワードをリセットする

今日のタスク1. Linuxディストリビューションの選択2.vmwareが仮想マシン(centos)...

Vue3 でパンくず関数コンポーネントをカプセル化するいくつかの方法

目次序文1. パンくずリストはなぜ必要なのでしょうか? 2. 一次包装1. 実装のアイデア2. コー...

ApacheとTomcatを組み合わせて静的状態と動的状態を分離する方法

実験環境ApacheとTomcatは両方ともIPアドレス192.168.153.136のホストにイン...

MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論

目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...

WeChatアプレット開発によりホームページポップアップボックスアクティビティガイダンス機能が実現

目次1. 需要2. データベース設計3.Javaバックグラウンド構成の実装4. WeChatアプレッ...

MySQL 5.7.21 履歴データディレクトリからデータを復元するチュートリアルの解凍バージョン

状況の説明: データベースが異常に起動およびシャットダウンしたため、サービスを再度起動したときに「起...

Vue 手書き読み込みアニメーション プロジェクト

ページが応答しない場合、白い画面が表示されないように、読み込みアニメーションを表示するのがユーザーフ...

MySQL の時間タイプの選択

目次日時タイムスタンプ選び方ミリ秒の時間を保存する方法結論MySQL は、日付と時刻を処理するために...

Centos 用の rpm パッケージのカスタマイズと yum リポジトリの構築に関するチュートリアル

1 yumでソフトウェアをインストールしたときにダウンロードしたrpmパッケージを保存しますyum ...

Linux での MySQL のインストールに関する詳細なチュートリアル

1. MySQLサービスをシャットダウンする# service mysqld stop 2. rpm...

RabbitMQ の Docker インストールと設定手順

目次単一マシンの展開オンラインプルミラーを見るRabbitMQを作成して実行するMQコンテナを正常に...

ウェブページデザインのための4つの実践的なヒント

関連記事: Web コンテンツ ページを作成するための 9 つの実用的なヒント<br />...

MycliはMySQLコマンドライン愛好家にとって必須のツールです

マイクリMyCLI は、自動補完と構文の強調表示を備えた MySQL、MariaDB、および Per...

メタビューポートタグ(モバイルブラウジングズームコントロール)の使用方法

OP が現在のファームウェアで Web ページを開くと、常に 50% にズームアウトされてから表示さ...