ホームページ > ウェブフロントエンド > jsチュートリアル > React useEffect フックで非同期関数を使用するとクリーンアップ警告がスローされるのはなぜですか?それを修正するにはどうすればよいですか?

React useEffect フックで非同期関数を使用するとクリーンアップ警告がスローされるのはなぜですか?それを修正するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-26 17:26:30
オリジナル
915 人が閲覧しました

Why Does My React useEffect Hook with Async Functions Throw a Cleanup Warning, and How Can I Fix It?

useEffect 中の非同期関数に対する React フックの警告: クリーンアップ関数が必要です

React の useEffect フック内で非同期関数を使用すると、「useEffect 関数は次のことを行う必要がある」という警告が表示されることがあります。クリーンアップ関数を返すか、何も返しません。」この警告は、返された関数が適切にクリーンアップされていない場合にメモリ リークが発生する可能性があるためです。

React バージョン 18 未満 では、一般に useEffect 内で匿名関数を使用して、個別のクリーンアップ関数の必要性を回避できます。ただし、明確性や再利用性のために名前付き関数を使用したい場合は、次の 2 つのアプローチを利用できます。

  1. 非同期関数を useEffect の外に移動する:

    useEffect の外側で非同期関数を定義し、それを直接呼び出します。このアプローチにより、useEffect 内のクリーンアップ関数の必要がなくなります。

  2. useCallback および useEffect でコールバックを使用する:

    名前付きを使用する必要がある場合useEffect 内で関数を実行し、依存関係の変化を観察する場合は、useCallback を使用して関数をラップし、それを依存関係として useEffect に渡すことができます。これにより、依存関係が変更された場合に useEffect が再度実行され、前の関数呼び出しのクリーンアップがトリガーされます。

React バージョン 18 以降、Suspense の使用機能コンポーネント内のデータ取得には推奨されます。 Suspense を使用すると、データが利用可能になるまでフォールバック UI を提供しながら、非同期操作を処理できます。このアプローチにより、クリーンアップ関数と潜在的な競合状態の両方が不要になります。

Suspense を使用した簡略化された例を次に示します。

import React, { useState, Suspense } from 'react';

function App() {
  const [data, setData] = useState(null);

  const fetchData = async () => {
    const res = await fetch('api/data');
    const data = await res.json();
    setData(data);
  };

  return (
    <Suspense fallback={'Loading...'}>
      <div>{data ? JSON.stringify(data) : 'No data yet'}</div>
    </Suspense>
  );
}
ログイン後にコピー

以上がReact useEffect フックで非同期関数を使用するとクリーンアップ警告がスローされるのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート