Reactのヒントはフックの依存関係の問題を解消する方法を教えます

Reactのヒントはフックの依存関係の問題を解消する方法を教えます

reactプロジェクトで非常に一般的なシナリオ:

const [watchValue、setWatchValue] = useState('');
const [otherValue1, setOtherValue1] = useState('');
const [otherValue2, setOtherValue2] = useState('');

使用効果(() => {
    何かを実行します(他の値1、他の値2);
}, [watchValue, otherValue1, otherValue2]);

watchValueが変更されたときにdoSomethingを実行し、他の値otherValue1otherValue2を参照します。

ここで厄介な疑問が浮かびます。

  • otherValue1otherValue2依存関係配列に追加されていない場合、 doSomething otherValue1otherValue2の古い変数参照にアクセスする可能性が高く、予期しないエラーが発生します ( hooks関連のeslintがインストールされている場合は、警告が表示されます)。
  • 逆に、 otherValue1otherValue2依存関係配列に追加されると、これら 2 つの値が変更されたときにdoSomethingも実行されますが、これは望ましいことではありません (値を参照するだけで、 doSomethingをトリガーしたくはありません)。

この問題は、 otherValue1otherValue2 refに変更することで解決できます。

const [watchValue、setWatchValue] = useState('');
const other1 = useRef('');
other2 は useRef() を使用します。

// 参照は変更されないため、依存関係配列に ref を追加する必要はありません useEffect(() => {
    何かを実行します(other1.current、other2.current);
}, [ウォッチ値]);

この方法では、 other1other2の変数参照は変更されないため、前の問題は解決されますが、新しい問題が発生します。other1 とother2 other1 currentの値が変更されても、コンポーネントの再レンダリングはトリガーされません ( useRef的current変更によってコンポーネントのレンダリングがトリガーされることはありません)。そのため、値が変更されてもインターフェイスは更新されません。

これはhooksでは頭痛の種です。useState useStateは再レンダリングをトリガーし、インターフェースを最新の状態に保ちますが、 useEffectの依存関係として使用されると、常に不要な関数の実行をトリガーします。 useRef変数はuseEffect依存関係として安全に使用できますが、コンポーネントのレンダリングはトリガーされず、インターフェースは更新されません。
どうすれば解決できるでしょうか?

useRefuseStateの機能を組み合わせて、新しいhooks関数useStateRefを構築できます。

「react」から useState、useRef をインポートします。

// useState の応答性を維持しながら useRef の参照特性を使用する type StateRefObj<T> = {
  _状態: T;
  値: T;
};
デフォルト関数 useStateRef<T>( をエクスポートする
  初期状態: T | (() => T)
): StateRefObj<T> {
  // 初期化値 const [init] = useState(() => {
    if (typeof initialState === "function") {
      初期状態を () => T として返します ();
    }
    初期状態を返します。
  });
  // コンポーネントのレンダリングをトリガーする状態を設定します。const [, setState] = useState(init);
  
  // 値を読み取ると、最新の値が取得されます // 値を設定すると、setStateがトリガーされ、コンポーネントがレンダリングされます const [ref] = useState<StateRefObj<T>>(() => {
    戻る {
      _状態: 初期化、
      値を設定する(v: T) {
        this._state = v;
        状態を設定します。
      },
      値を取得する() {
        this._state を返します。
      },
    };
  });
  
  // 返されるのは参照変数であり、コンポーネントのライフサイクル全体を通じて変更されません。 return ref;
}

したがって、次のように使用できます。

定数ウォッチ = useStateRef('');
const other1 = useStateRef('');
const other2 = useStateRef('');

// 値を次のように変更します: watch.value = "new";

使用効果(() => {
    何かを実行します(other1.値、other2.値);
   // 実際、これら 3 つの値は参照変数となり、コンポーネントのライフサイクル全体で変更されないため、依存関係配列を追加する必要はありません。 // ただし、React Hooks の eslint プラグインは、useRef を参照としてのみ認識できます。追加されていない場合は警告が表示されます。変数参照の安全性のため、引き続き追加されます。 }, [watch.value, other1, other2]);

このように、 watch, other1other2 useRefの参照機能を持ち、 doSomethingの不要な実行をトリガーしません。 useStateの応答性により、 .valueを変更すると、コンポーネントのレンダリングとインターフェースの更新がトリガーされます。
変数の変更によってdoSomethingをトリガーしたい場合は、依存関係配列にwatch.valueを追加します。値を参照するだけでdoSomethingをトリガーしたくない場合は、変数自体を配列に追加します。

上記は、フック依存性のトラブルを解消するためのReactのヒントの詳細です。Reactフック依存性の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • React Hooksの詳細な説明
  • React Hooksを使用する際のよくある落とし穴
  • 30分でReact Hooksを包括的に理解できます
  • Reactフックの仕組み
  • Reactフックの長所と短所
  • React のクラスからフックへの移行

<<:  実稼働環境でのNginx高可用性ソリューションの実装プロセスの分析

>>:  CentOS 7 での mysql 5.7 のインストール チュートリアル

推薦する

Linuxシステムの操作レベルの詳細な紹介

目次1. Linuxシステムの操作レベルの概要2. 実行レベルを確認する3. 現在のシステムの動作レ...

js は複数の画像を zip にパッケージ化します

目次1. ファイルをインポートする2. HTMLページ3. メインコード4. 画像をbase64に変...

Vue3 の emitting と attr の違いの分析

目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...

VMware ESXi 5.5 の展開および構成図のプロセス

目次1. インストール要件2. OSイメージのダウンロード3. VMware Workstation...

JS デコレータ パターンと TypeScript デコレータ

目次デコレータパターンの紹介TypeScript のデコレータデコレータの使用デコレーターファクトリ...

Tomcat コアコンポーネントとアプリケーションアーキテクチャの詳細な説明

目次Web コンテナとは何ですか? HTTP の性質HTTP リクエスト応答の例クッキーとセッション...

MySQL 悲観的ロックと楽観的ロックの実装

目次序文実際の戦闘1. ロックなし2. 悲観的ロック3. 楽観的ロック要約する序文悲観的ロックと楽観...

MySQL ストアド プロシージャの権限の問題の概要

MySQL ストアド プロシージャは、確かに、非常にまれな使用シナリオのように見えます。この問題は、...

XHTML 2.0 新機能プレビュー

<br />ブラウザが次世代のXHTMLを処理できるようになる前に、このよりリッチなコン...

HTML CSS を使用して div またはテーブルを指定した位置に固定する方法

CSSコードコンテンツをクリップボードにコピー.bottomTable{背景色: rgb (249,...

このような大画面のデジタルスクロール効果が必要になる場合があります

大画面のデジタル スクロール効果は、最近の作業における大画面 UI ダイアグラムから生まれました。U...

Nginx ロードバランシング/SSL 構成の実装

負荷分散とは何ですか?ドメイン名が複数の Web サーバーを指している場合は、nginx ロード バ...

DockerコンテナでのMySQLデータのインポート/エクスポートの詳細な説明

序文MySQL データのインポートとエクスポートは mysqldump コマンドで解決できることは誰...

vue2 vue3 での Echarts の詳細な使用方法

目次1. インストール2. vue2でEchartsを使用するmain.jsファイル内コンテナが与え...

この構成ファイルの排他ロックに失敗したという VMware 仮想マシンのプロンプトの解決方法

VMware が異常シャットダウンした後、再起動すると「この構成ファイルを排他的にロックできませんで...