Bileşende bir veya daha fazla useEffect kullanmalı mıyım?


105

Bazı yan etkilerim var ve bunları nasıl organize edeceğimi bilmek istiyorum:

  • tek kullanımlık olarak
  • veya birkaç kullanım Etkisi

Performans ve mimari açısından daha iyi olan nedir?

Yanıtlar:


162

Takip etmeniz gereken model, kullanım durumunuza bağlıdır.

İlk olarak , ilk bağlama sırasında olay dinleyicisi eklemeniz ve bunları kaldırırken temizlemeniz gereken bir durum olabilir ve belirli bir dinleyicinin temizlenmesi ve bir özellik değişikliğinde yeniden eklenmesi gereken başka bir durum olabilir. Böyle bir durumda, iki farklı kullanım etkisi kullanmak, ilgili mantığı bir arada tutmak ve performans avantajlarına sahip olmak daha iyidir.

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])

İkincisi: Bir küme arasında herhangi bir durum veya sahne değiştiğinde bir API çağrısını veya başka bir yan etkiyi tetiklemeniz gereken bir durum olabilir. Böyle bir durumda useEffect, izlenecek ilgili değerlere sahip bir bekar iyi bir fikir olmalıdır.

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

Üçüncüsü: Farklı değerlerin değiştirilmesi üzerine farklı eylemler gerçekleştirmeniz gerektiğinde üçüncü bir durum. Böyle bir durumda, ilgili karşılaştırmaları farklı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
peki ya yukarıdaki İkinci ve Üçüncü örnek arasında bir orta yol ? : bir durum / sahne alt kümesi değiştiğinde çalışan mantığınız var, ancak her birinin çalışması gereken bazı ortak koda ek olarak çalışması gereken ayrı bir mantığı var? Kullanmazsınız [](çünkü hala değişiklik beklediğiniz bir durum / sahne alt kümesi ) ama aynı zamanda kodu yeniden kullanmak istersiniz. Ayrı kullanıyor useEffectsve paylaşılan kodu, her birinin ayrı ayrı çağırdığı bir işleve mi koyuyorsunuz?
ecoe

2
Aşağıdaki cevabın da önerdiği gibi, React ekibi kancaları endişeye göre ayırmayı öneriyor, böylece onu birden fazla useEffectaramaya ayırabilirsiniz.
hakazvaka

28
UseCase yazış şeklini beğendim.
VerticalGrain

Her zaman tanım sırasına göre tetiklenirler mi? yani efekt1 her zaman önce çağrılır, sonra efekt2?
computrius

1
@computrius Evet ,React will apply every effect used by the component, in the order they were specified.
August Janse

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.