Когда срабатывает useEffect в componentWillUnmount?

Я прочитал ниже заявление в блоге, там написано что-то вроде этого

useEffect(() => {
  API.getUser(userId);
}, [userId]);

Optionally the second parameter can also just be an empty array, in this case it will only execute on componentDidMount and componentWillUnmount and the effect won't run on componentDidUpdate.

Выполняется ли API.getUser при размонтировании компонента (componentWillUnmount)? насколько я знаю, componentWillUnmount срабатывает, когда вы переходите со страницы A на страницу B. Теперь я запутался, для меня приведенный выше код действует как componentDidMount, потому что userId изменится с undefined на id один раз.

Это длинное чтение, но, как говорится, полное руководство по useEffect от создателя: overreacted.io/a-complete-guide-to-useeffect

SakoBu 28.05.2019 11:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
1 610
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете вернуть функцию очистки из useEffect, которая будет запущена до размонтирования.

useEffect(() => {
  const subscription = props.source.subscribe(); // this will fire at after did Mount/ didUpdate
  return () => {
    // Clean up the subscription
    subscription.unsubscribe(); // this will afire at willUnmount
  };
});

Если вы передаете пустой массив в качестве второго параметра.

useEffect(() => {
  const subscription = props.source.subscribe(); // this run only after first rnede i.e componentDidmount
  return () => {
    // Clean up the subscription
    subscription.unsubscribe(); // this will afire at willUnmount ie componentWillUnmount
  };
}, []);

нет. Это верно. если вы передадите пустой массив в качестве второго параметра, useEffect будет запускаться только после первого рендеринга, он не будет запускаться после каждого обновления. и возвращенная функция будет работать до размонтирования.

Amit Chauhan 28.05.2019 10:29

ваш первый блок кода имеет комментарий //// это загорится на willUnmount, что вы имеете в виду?

Hanz 28.05.2019 10:32

пустой массив делает useEffect точно так же, как сказал @eramit2010. для кода Hanz каждый раз при изменении useId будет выполняться код внутри useEffect

liu pluto 28.05.2019 10:33

второй параметр в useEffect — зависимости. поэтому, если вы передаете его как пустой массив, он сообщает useEffect о запуске только после первого рендеринга (componentDidUpdate), а возвращаемая функция является функцией очистки, поэтому она будет выполняться до размонтирования (componentWillUnmount)

Amit Chauhan 28.05.2019 10:34

чтобы избежать путаницы: для первого примера кода subscription.unsubscribe() будет запускаться в cWU, но также он будет запускаться перед каждым повторным рендерингом.

skyboyer 28.05.2019 10:56

нет. useEffect никогда не запускается перед рендерингом. он всегда запускается после рендера. и функция очистки запускается только перед размонтированием (componetWillUnmount).

Amit Chauhan 28.05.2019 11:00
Ответ принят как подходящий

Вы немного запутались с формулировкой. Это не эффект, который выполняется при размонтировании, когда вы передаете пустой массив, а функция очистки, которая является функцией, возвращаемой из useEffect, которая будет выполнена.

например, вы можете получить вышеуказанный эффект, например

useEffect(() => {
  API.getUser(userId);
  return () => {
      // cancel api here
  }
}, [userId]);

Таким образом, в приведенном выше примере анонимная функция, возвращаемая useEffect, будет вызываться до того, как эффект будет запущен во второй раз (что происходит при изменении userId) или во время размонтирования.

формулировка сбивает с толку, потому что у нее нет второй функции возврата

Hanz 29.05.2019 04:49

Другие вопросы по теме