componentWillUnmount
— это метод жизненного цикла (lifecycle method) классового компонента в React, который вызывается непосредственно перед тем, как компонент будет "размонтирован" (удален из DOM-дерева). Это критически важный метод для очистки ресурсов и предотвращения утечек памяти (memory leaks).
Метод используется для:
clearTimeout
, clearInterval
AbortController
class ChatComponent extends React.Component {
componentDidMount() {
// Подписываемся на события при монтировании
this.socket = new WebSocket('wss://chat.example.com');
this.socket.onmessage = this.handleMessage;
// Устанавливаем таймер
this.intervalId = setInterval(this.pingServer, 30000);
// Инициализируем стороннюю библиотеку
this.chart = new ChartJS(this.refs.chartCanvas, { /* options */ });
}
componentWillUnmount() {
// 1. Закрываем WebSocket соединение
this.socket.close();
// 2. Очищаем интервал
clearInterval(this.intervalId);
// 3. Уничтожаем экземпляр чарта
this.chart.destroy();
// 4. Отменяем возможные pending-запросы
if (this.controller) this.controller.abort();
}
render() {
return <div ref="chartCanvas" />;
}
}
setState()
здесь бесполезен, так как компонент будет уничтоженcomponentDidMount
, должно быть очищено здесьВ функциональных компонентах с хуками используется возвращаемая функция из useEffect
:
function ChatComponent() {
useEffect(() => {
const socket = new WebSocket('wss://chat.example.com');
const intervalId = setInterval(() => {}, 30000);
const controller = new AbortController();
return () => { // Аналог componentWillUnmount
socket.close();
clearInterval(intervalId);
controller.abort();
};
}, []);
return <div />;
}
componentDidMount
должна быть отписка в componentWillUnmount
componentWillUnmount
— это критически важный метод жизненного цикла, выполняющий роль "уборщика" перед удалением компонента. Его правильное использование предотвращает утечки памяти, ошибки выполнения кода в несуществующих компонентах и обеспечивает корректную работу приложения. В современных React-приложениях его функциональность заменяется механизмом очистки эффектов в useEffect
, но понимание этого метода необходимо для работы с классовыми компонентами и глубокого понимания жизненного цикла React-приложений.