#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. На самом деле я был неправ, и да, ваш ответ абсолютно правильный, я нашел условие, которое уничтожало компонент почти при каждом первом рендеринге приложения. Вот почему он запускается дважды, и я подумал, что это не помогает.