Функции очистки в хуке UseEffect в React — объяснение
1 декабря 2022 г.с примерами.
Если вы начинаете изучать React или уже некоторое время пользуетесь этой библиотекой, наверняка вы сталкивались с некоторыми ошибками или предупреждениями, связанными с асинхронными функциями, особенно с использованием хука useEffect
.
Когда я изучал функционал этого хука, я не мог понять зачем использовать return в этой функции, так как в большинстве случаев его использовать не обязательно, а React прекрасно работает и без него.
По мере того, как я лучше знакомился с тем, как работает React, и с жизненным циклом компонентов, я начал замечать, что во многих случаях слишком важно использовать возврат в хуке useEffect
, особенно в побочные эффекты.
Каковы побочные эффекты?
Побочным эффектом может быть получение данных с удаленного сервера, чтение или запись в локальное хранилище, настройка прослушивателей событий или настройка подписки. Эти побочные эффекты могут возникать при нажатии кнопки, отправке формы или подключении и отключении компонента.
Хук React useEffect
позволяет функциональным компонентам выполнять действия, когда компонент монтируется или когда изменяются некоторые свойства или состояния. Этот хук также позволяет выполнять очистку, когда компонент размонтирован.
Зачем устранять побочные эффекты?
Обработка побочных эффектов в React — задача средней сложности. Однако время от времени у вас могут возникать трудности на пересечении жизненного цикла компонента (первоначальный рендеринг, сборка, использование, разборка) и жизненного цикла побочных эффектов (запущено, выполняется, завершено).
Одна из таких трудностей возникает, когда побочный эффект завершается и пытается обновить состояние уже дизассемблированного компонента.
Это вызывает следующее предупреждение React:
Утечки памяти в приложениях React в основном являются результатом того, что подписки не были отменены, когда компонент был смонтирован до его размонтирования.
Они вызывают много проблем, в том числе:
* Влияет на производительность проекта за счет уменьшения объема доступной памяти. * Замедление работы приложения. * Системный сбой.
Поэтому необходимо устранить проблемы с утечкой памяти.
Что такое функция очистки useEffect?
Это функция хука useEffect
, которая позволяет нам останавливать побочные эффекты, которые больше не нужно выполнять, до того, как наш компонент будет размонтирован.
useEffect
построен таким образом, что мы можем возвращать функцию внутри него, и именно в этой функции возврата происходит очистка.
Например, Компонент А запрашивает у API список продуктов, но при этом асинхронном запросе Компонент А удаляется из DOM (размонтируется). Нет необходимости выполнять этот асинхронный запрос.
Таким образом, в качестве метода очистки для улучшения вашего приложения вы можете очистить (отменить) асинхронный запрос, чтобы он не был завершен.
Функция очистки useEffect< /код>:
useEffect(() => {
// Your effect
return () => {
// Cleanup
}
}, [input])
Очистка эффекта
Отмена запроса на получение
Существуют разные способы отмены вызовов запросов на выборку, мы можем использовать fetch AbortController
или Axios AbortController.
Чтобы использовать AbortController
, мы должны создать контроллер с помощью конструктора AbortController()
. Затем, когда инициируется наш запрос на выборку, мы передаем AbortSignal
в качестве опции внутри объекта запроса options
.
Это связывает контроллер и сигнал с запросом на выборку и позволяет отменить его в любое время с помощью AbortController.abort()
:
useEffect(() => {
//create a controller
let controller = new AbortController();
(async () => {
try {
const response = await fetch(API,
{
// connect the controller with the fetch request
signal: controller.signal,
},
);
// handle success
setList(await response.json());
// remove the controller
controller = null;
} catch (e) {
// Handle the error
}
})();
//aborts the request when the component umounts
return () => controller?.abort();
},[]);
useEffect(() => {
// create a controller
const controller = new AbortController();
axios
.get(API, {
signal: controller.signal
})
.then({data}) => {
// handle success
setList(data);
})
.catch((err) => {
// Handle the error
});
//aborts the request when the component umounts
return () => controller?.abort();
}, []);
Очистка тайм-аутов
При использовании функций таймера setTimeout(callback, time)
мы можем очистить их при размонтировании с помощью специальной функции clearTimeout(timerId)
.
useEffect(() => {
let timerId = setTimeout(() => {
// do something
timerId = null;
}, 3000);
// cleanup the timmer when component unmout
return () => clearTimeout(timerId);
}, []);
Очистка интервалов
Как и тайм-ауты, setInterval(callback, time)
имеют специальную функцию для их очистки с помощью функции clearInterval(intervalId)
.
useEffect(() => {
let intervalId = setInterval(() => {
// do something like update the state
}, 1000);
// cleanup the timer when component unmout
return () => clearInterval(interval);
}, []);
Очистка прослушивателей событий
Очистка прослушивателей происходит с помощью window.removeEventListener
. Вызов removeEventListener
должен ссылаться на ту же функцию в вызове removeEventListener
, чтобы правильно удалить прослушиватель.
useEffect(() => {
// function to add to EventListener
const handleKeyUp= (event) => {
switch (event.key) {
case "Escape":
setCollapsed(true);
break;
}
}
window.addEventListener("keyup", handleKeyUp);
// cleanup the listener when component unmout
return () => window.removeEventListener("keyup", handleKeyUp);
}, []);
Очистка веб-сокетов
При создании соединения WebSocket вы можно закрыть в функции очистки socket.close()
.
useEffect(() => {
const ws = new WebSocket(url, protocols)
// do what you want with the socket
ws.onmessage = (event) => {
setValue(JSON.parse(event.data));
};
// cleanup the web socket when component unmout
return () => ws.close()
}, [])
Заключение
Мы узнали, что некоторые побочные эффекты требуют очистки, чтобы избежать утечек памяти и ненужного и нежелательного поведения. Мы должны узнать, когда и как использовать функцию очистки хука useEffect
, чтобы избежать этих проблем и оптимизировать приложения.
Я рекомендую убрать асинхронные эффекты, когда компонент размонтирован. Кроме того, если асинхронный побочный эффект зависит от значений реквизита или состояния, рассмотрите возможность их очистки при обновлении компонента.
Я надеюсь, что вы нашли эту статью полезной и теперь вы можете правильно использовать функцию очистки.
Подробнее:
https://hackernoon.com/autocomplete-search-component-with -react-and-typescript?embedable=true
:::информация Также опубликовано здесь.
:::
Оригинал