ホームページ  >  に質問  >  本文

props から関数を使用すると useEffect が起動するのはなぜですか (関数は変更されていません)。

メインコンポーネントはモーダル/ダイアログを呼び出しています。

リーリー

MyDialog コードは次のとおりです:

リーリー

[キャンセル] をクリックして onClose を呼び出すと、useEffecttriggered であることがわかります。理由は何ですか?私の理解では、onClose 関数オブジェクト (props から) は変更されないため、そうすべきではないということです。

P粉662802882P粉662802882425日前436

全員に返信(1)返信します

  • P粉165823783

    P粉1658237832023-09-13 11:52:56

    React の useEffect フックは、依存関係配列内の依存関係が変更されると実行されます。あなたの場合、 useEffectonClose プロパティに依存します。したがって、onClose プロパティが変更されるたびに実行されます。

    ただし、コード内の onClose 関数が変更されていない場合でも、JavaScript が関数識別を処理する方法により、useEffect が引き続き実行される可能性があります。 JavaScript では、関数を定義するたびに、それがまったく同じことを行う場合でも、新しいインスタンスが作成されます。

    したがって、あなたの場合、コンポーネントが再レンダリングされるたびに、レンダー関数の新しい関数として closeDialog を定義します。これは、React の観点から見ると、onCloseuseEffect をトリガーするたびに新しい関数であることを意味します。

    この問題を解決するには、useCallback フックを使用して、依存関係が変更されない限り、closeDialog 関数がレンダリング間で安定した ID を持つようにします。 リーリー

    上記の例では、

    useCallback は、依存関係の 1 つが変更された場合にのみ変更される関数のメモ化されたバージョンを返します。この場合、依存関係配列は空 ([]) です。これは、closeDialog 関数の ID が再レンダリング後も安定したままであることを意味します。

    返事
    0
  • キャンセル返事