コンポーネントで1つまたは複数のuseEffectを使用する必要がありますか?


114

適用するいくつかの副作用があり、それらを整理する方法を知りたいです:

  • 単一のuseEffectとして
  • またはいくつかのuseEffects

パフォーマンスとアーキテクチャの点で何が優れていますか?

回答:


174

従う必要のあるパターンは、ユースケースによって異なります。

まず、最初のマウント中にイベントリスナーを追加し、アンマウント時にそれらをクリーンアップする必要がある状況と、特定のリスナーをクリーンアップして小道具の変更時に再度追加する必要がある場合があります。このような場合、2つの異なるuseEffectを使用すると、関連するロジックをまとめるだけでなく、パフォーマンス上の利点も得られます。

useEffect(() => {
   // adding event listeners on mount here
   return () => {
       // cleaning up the listeners here
   }
}, []);

useEffect(() => {
   // adding listeners everytime props.x changes
   return () => {
       // removing the listener when props.x changes
   }
}, [props.x])

2番目:状態または小道具のいずれかがセット間で変更されたときに、API呼び出しまたはその他の副作用をトリガーする必要がある場合があります。このような場合、useEffect監視する関連値を持つシングルをお勧めします

useEffect(() => {
    // side effect here on change of any of props.x or stateY
}, [props.x, stateY])

3番目:異なる値の変更に対して異なるアクションを実行する必要がある場合の3番目のケース。このような場合、関連する比較を異なるものに分けてくださいuseEffects

useEffect(() => {
   // some side-effect on change of props.x
}, [props.x])

useEffect(() => {
   // another side-effect on change of stateX or stateY 
}, [stateX, stateY])

1
上記の2番目3番目の例の中間点はどうですか?:状態/小道具のサブセットが変更されたときに実行されるロジックがありますが、実行する必要があるいくつかの一般的なコードに加えて、実行する必要がある個別のロジックがありますか?使用しませんが[](変更を待っている状態/小道具のサブセットにすぎないため)、コードを再利用することもできます。別々に使用しuseEffects、共有コードをそれぞれ別々に呼び出す関数に配置しますか?
ecoe

2
以下の答えが示唆するように、Reactチームは懸念によってフックを分離することを提案しているので、それを複数のuseEffect呼び出しに分割します。
hakazvaka

31
私はあなたがuseCaseを書いた方法が好きです。
VerticalGrain

それらは常に定義順にトリガーされますか?つまり、effect1は常に最初に呼び出され、次にeffect2と呼ばれますか?
computrius

1
@computriusはいReact will apply every effect used by the component, in the order they were specified.
8月1月

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.