**UNSAFE_componentWillMount()
componentWillMount()
вызывается непосредственно перед монтированием. Он вызывается перед render()
, поэтому синхронный вызов setState()
в этом методе не вызовет дополнительную отрисовку. Как правило, мы рекомендуем использовать constructor()
вместо этого для инициализации состояния.
**componentDidMount()
Когда элемент componentDidMount()
вызван - это значит , что DOM-элемент гарантировано находится на странице и он проинициализирован.
componentDidMount()
componentDidMount()
используется для иницициализации (запросы к API, асинхронное получение данных и тд) Не используйте конструктор, для кода, который создаёт побочные эффекты.
Вы можете сразу вызвать setState() в componentDidMount()
. Это вызовет дополнительный рендер перед тем, как браузер обновит экран. Гарантируется, что пользователь не увидит промежуточное состояние, даже если render()
будет вызываться дважды. Используйте этот подход с осторожностью, он может вызвать проблемы с производительностью. В большинстве случаев начальное состояние лучше объявить в constructor()
. Однако, это может быть необходимо для случаев, когда нужно измерить размер или положение DOM-узла, на основе которого происходит рендер. Например, для модальных окон или всплывающих подсказок.
**componentDidUpdate()
componentDidUpdate(prevProps, prevState, snapshot)
Он вызывается после того, как компонент обновился. А компонент обновляется после того, как получает новые props
или state
. Этот метод вызывается после render
- в нём можно, к примеру, запрашивать новые данные для обновленных свойств.
componentDidUpdate(prevProps) {
// Популярный пример (не забудьте сравнить пропсы):
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
В componentDidUpdate()
можно вызывать setState()
, однако его необходимо обернуть в условие, как в примере выше, чтобы не возник бесконечный цикл. Вызов setState()
влечет за собой дополнительный рендер, который незаметен для пользователя, но может повлиять на производительность компонента. Вместо «отражения» пропсов в состоянии рекомендуется использовать пропсы напрямую.
В тех редких случаях когда реализован метод жизненного цикла getSnapshotBeforeUpdate()
, его результат передаётся componentDidUpdate()
в качестве третьего параметра snapshot
.
Примечание:
componentDidUpdate()
не вызывается (после рендера) , еслиshouldComponentUpdate()
возвращаетfalse
.
**getSnapshotBeforeUpdate()
- не реализован на хуках
getSnapshotBeforeUpdate(prevProps, prevState)
getSnapshotBeforeUpdate()
вызывается непосредственно перед тем, как последний отрисованный вывод будет зафиксирован, например, в DOM. Он позволяет вашему компоненту захватывать некоторую информацию из DOM (например, положение прокрутки), прежде чем она возможно будет изменена. Любое значение, возвращаемое этим жизненным циклом, будет передано как параметр componentDidUpdate()
.
Этот не распространённый вариант использования, но он может быть в пользовательских интерфейсах, таких как цепочка сообщений в чатах, который должен обрабатывать позицию прокрутки особым образом.
Должно быть возвращено значение снимка (или null
).
**componentWillUnmount()
С помощью этого метода вызывается удаление компонента. Метод используется для очистки ресурсов (таймеры, интервалы, запросы к серверу и др)
В момент вызова метода DOM все еще находится на странице.
Не используйте setState() в componentWillUnmount()
, так как компонент никогда не рендерится повторно. После того, как экземпляр компонента будет размонтирован, он никогда не будет примонтирован снова.
**componentDidCatch()
- не реализован на хуках
componentDidCatch(error, info)
error
— перехваченная ошибкаinfo
— объект с ключомcomponentStack
, содержащий информацию о компоненте, в котором произошла ошибка.
Задача этого метода отлов ошибок из функций, которые отвечают за корректный рендер компонентов. Принцип работы метода схож с try/catch , т.е ошибку отлавливает каждый блок.
Не обрабатываются ошибки в event listener ’ ах и в асинхронном коде (запросы к серверу и т.п.)
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Обновите состояние так, чтобы следующий рендер показал запасной интерфейс.
return { hasError: true };
}
componentDidCatch(error, info) { // Пример "componentStack": // in ComponentThatThrows (created by App) // in ErrorBoundary (created by App) // in div (created by App) // in App logComponentStackToMyService(info.componentStack); }
render() {
if (this.state.hasError) {
// Здесь можно рендерить запасной интерфейс
return <h1>Что-то пошло не так.</h1>;
}
return this.props.children;
}
}
Обработка ошибок в методе componentDidCatch()
отличается между React-сборками для продакшена и разработки.
В процессе разработки ошибки будут подниматься (всплывать) наверх до объекта window
, поэтому любой вызов window.onerror
или window.addEventListener('error', callback)
перехватит ошибки, которые были обработаны componentDidCatch()
.
На продакшене, напротив, ошибки не всплывают, поэтому родительский обработчик ошибок перехватит только те ошибки, которые не были обработаны componentDidCatch()
.
Примечание:
В случае ошибки вы можете рендерить запасной интерфейс с помощью
componentDidCatch()
, вызвавsetState
. Однако, этот способ скоро будет считаться устаревшим. Используйтеstatic getDerivedStateFromError()
для рендера резервного интерфейса.