Czy powinienem użyć jednego lub wielu useEffect w komponencie?

Mam kilka skutków ubocznych do zastosowania i chcę wiedzieć, jak je zorganizować:

  • jako pojedynczy useEffect
  • lub kilka efektów użycia

Co jest lepsze pod względem wydajności i architektury?

Author: PrimeTimeTran, 2019-01-02

2 answers

Wzór, którego musisz przestrzegać, zależy od Twojego zastosowania.

Po pierwsze , możesz mieć sytuację, w której musisz dodać detektor zdarzeń podczas początkowego montowania i wyczyścić je przy odmontowaniu, a także inny przypadek, w którym konkretny detektor musi zostać wyczyszczony i ponownie dodany przy zmianie właściwości. W takim przypadku korzystanie z dwóch różnych useEffect jest lepsze, aby zachować odpowiednią logikę razem, a także mieć korzyści z wydajności

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

Po Drugie: może być przypadek, w którym musisz wywołać wywołanie API lub inny efekt uboczny, gdy którykolwiek ze Stanów lub właściwości zmieni się między zestawem. W takim przypadku dobrym pomysłem powinien być pojedynczy useEffect z odpowiednimi wartościami do monitorowania

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

Trzeci: trzeci przypadek, gdy trzeba podjąć różne działania na zmianę różnych wartości. W takim przypadku należy oddzielić odpowiednie porównania na różne useEffects

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

useEffect(() => {
   // another side-effect on change of stateX or stateY 
}, [stateX, stateY])
 196
Author: Shubham Khatri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-02 09:46:44

Powinieneś użyć wielu efektów, aby rozdzielić obawy, zgodnie z sugestią reactjs.org https://reactjs.org/docs/hooks-effect.html#tip-use-multiple-effects-to-separate-concerns

 43
Author: Guy Engel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-23 10:50:27