PassFront
  1. PassFront
  2. База знаний
  3. Ошибки и отладка

В чем разница между componentDidCatch и getDerivedStateFromError?

Ошибки и отладка

`componentDidCatch` и `getDerivedStateFromError` — методы Error Boundary в React: оба ловят ошибки рендера дочерних компонентов, но `getDerivedStateFromError` обновляет состояние для fallback UI, а `componentDidCatch` — для побочных эффектов (логирования).

getDerivedStateFromError

Статический метод; вызывается при ошибке в рендере потомка. Возвращает новое состояние для отображения fallback UI. Должен быть чистым (без побочных эффектов):

static getDerivedStateFromError(error) {
  return { hasError: true }; // переключить на fallback
}

Выполняется на фазе рендера.

componentDidCatch

Метод экземпляра; вызывается после ошибки. Для побочных эффектов: логирование, отправка в сервис мониторинга. Получает ошибку и info (стек компонентов):

componentDidCatch(error, errorInfo) {
  logToService(error, errorInfo); // побочный эффект
}

Выполняется на фазе commit.

Совместное использование

class ErrorBoundary extends React.Component {
  state = { hasError: false };
  static getDerivedStateFromError() {
    return { hasError: true };      // рендерим fallback
  }
  componentDidCatch(error, info) {
    logError(error, info);          // логируем
  }
  render() {
    return this.state.hasError ? <Fallback /> : this.props.children;
  }
}

Ограничения

Оба ловят ошибки рендера дочерних, но не ловят: ошибки в обработчиках событий, асинхронный код, ошибки самого boundary, SSR.

Коротко для собеседования

Оба — методы Error Boundary. getDerivedStateFromError — статический, чистый, обновляет state для fallback UI (фаза рендера). componentDidCatch — для побочных эффектов (логирование, фаза commit). Вместе: первый показывает fallback, второй логирует. Не ловят ошибки обработчиков и асинхронного кода.

Другие вопросы раздела