Функция очистки реакции, что не так?

#reactjs #use-effect

#reactjs #использование-эффект

Вопрос:

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

Итак, в отношении этой информации я создал компонент и добавил некоторый код, например, пусть он будет следующим

 useEffect(() => {
  console.log('didmount')
  return () => {
    console.log('will unmount2')
  }
})
  

Я ожидаю увидеть несколько консолей didmount, в зависимости от того, сколько раз я собираюсь изменять их реквизиты, и только один «будет mount2», прежде чем я изменю свой маршрут, поэтому компонент будет уничтожен,
но фактический результат будет следующим введите описание изображения здесь

Что я только что пропустил?

Ответ №1:

Вы не поняли или не полностью прочитали документы.

Кроме того, если компонент отображается несколько раз (как обычно), предыдущий эффект очищается перед выполнением следующего эффекта. В нашем примере это означает, что при каждом обновлении создается новая подписка.

Изменение реквизитов приводит к повторному запуску компонента. Что, в свою очередь, приводит к выполнению функции очистки.

Для вашего примера это означает, что вы должны видеть serveral didmount и will unmount2 в консоли в зависимости от того, сколько раз компонент выполнял повторный запуск.

Комментарии:

1. Кажется, вы правы, спасибо за ваше time…so нет никакого способа обработать событие размонтирования только сейчас…..

2. Есть. Если вы хотите обработать только размонтирование, взгляните на второй ответ.

3. В любом случае это работает не так, как я ожидаю, даже во втором случае срабатывает 2 раза, я уже прочитал много документации, невозможно выполнить только 1 вызов с перехватами, как это было с componentWillUnmount

Ответ №2:

привет, Артем, в вашей функции вам не хватает второго параметра, который является массивом зависимостей, без этого массива это приведет к бесконечному циклу, я предлагаю попробовать это

 // this will run exactly when the unmount component, not when the effects finishing running
useEffect(() => {
    return () => {
        console.log('unmount')
    }
}, [])
  

Комментарии:

1. Спасибо, я уже думал об этом, но это не помогает.

2. На самом деле я был неправ, и да, ваш ответ абсолютно правильный, я нашел условие, которое уничтожало компонент почти при каждом первом рендеринге приложения. Вот почему он запускается дважды, и я подумал, что это не помогает.