Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы жизненного цикла (Lifecycle Methods) в React
Жизненный цикл компонента — это последовательность событий, которые происходят с момента создания компонента до его удаления из DOM. В современном React используются в основном Hooks, но важно знать и классовые компоненты.
Подход 1: Функциональные компоненты с Hooks
У функциональных компонентов жизненный цикл управляется через useEffect Hook:
Монтирование (componentDidMount):
useEffect(() => {
console.log('Компонент смонтирован');
return () => {
console.log('Компонент удаляется');
};
}, []);
Обновление при изменении зависимостей:
useEffect(() => {
console.log('userId изменилась');
loadUserData(userId);
}, [userId]);
После каждого рендера:
useEffect(() => {
console.log('Выполняется после каждого рендера');
});
Подход 2: Классовые компоненты
constructor
Инициализация состояния и привязка методов:
class Component extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
}
componentDidMount
Выполняется после добавления компонента в DOM:
componentDidMount() {
console.log('Компонент добавлен в DOM');
this.loadData();
window.addEventListener('resize', this.handleResize);
}
componentDidUpdate
Выполняется после обновления props или state:
componentDidUpdate(prevProps, prevState) {
if (this.props.userId !== prevProps.userId) {
this.loadUserData(this.props.userId);
}
}
componentWillUnmount
Выполняется перед удалением компонента из DOM:
componentWillUnmount() {
console.log('Компонент удаляется');
window.removeEventListener('resize', this.handleResize);
}
shouldComponentUpdate
Оптимизация: контролирует необходимость ре-рендера:
shouldComponentUpdate(nextProps, nextState) {
return this.props.value !== nextProps.value;
}
Фазы жизненного цикла
Mounting: constructor → render → componentDidMount
Updating: render → componentDidUpdate
Unmounting: componentWillUnmount
Практические примеры
Загрузка данных:
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
fetchUser(userId).then(setUser);
}, [userId]);
return <div>{user?.name}</div>;
}
Подписка на события:
function WindowSize() {
const [size, setSize] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setSize(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return <div>{size}px</div>;
}
Таймер:
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setSeconds(s => s + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <div>{seconds}s</div>;
}
Сравнение таблица
| Фаза | Hooks | Класс |
|---|---|---|
| Инициализация | useState | constructor |
| После монтирования | useEffect([], []) | componentDidMount |
| После обновления | useEffect([dep]) | componentDidUpdate |
| Перед удалением | return cleanup | componentWillUnmount |
Правила useEffect
- Включай все зависимости в массив
- Очищай побочные эффекты через return
- Не вызывай условно (не в if внутри компонента)
- Вызывай только в компонентах или кастомных Hooks
Ключевые моменты
- Hooks — современный подход, более гибкий
- useEffect управляет всеми фазами жизненного цикла
- Cleanup функция очищает ресурсы при демонтировании
- Зависимости контролируют когда эффект выполняется
- Классовые методы всё ещё работают, но считаются legacy
Современный React полностью перешёл на Hooks, которые предоставляют более чистый и удобный способ управления жизненным циклом компонентов.
Похожие вопросы
- Что такое Responsive Web-страница?
- Все ли будешь хранить в state
- Что такое env?
- Где используется деструктуризация?
- К чему стремишься в работе
- Как придумываешь решение поставленной задачи?
- Почему псевдоэлементы так называются?
- Что из перечисленного может заблокировать отображение страницы: картинки, JS файлы, CSS файлы, Favicon, шрифты?
- Как отобразить массив элементов в компоненте в React?
- Что будет итоговыми данными Promise при использовании десяти then?
- Дожидается ли метод Promise.all выполнения всех Promise
- Чем занимаешься во внерабочее время?
- Какие типы данных можно передать по ссылке?
- Вел ли проекты самостоятельно
- Какие плюсы и минусы типизации TypeScript?
- Для чего нужен хук?
- Больше данных хранится в cookie или в localStorage
- Какую проблему решает useContext?
- Что такое async/await и как они связаны с Promise?
- Как создать новый процесс в Js?