0Pricing
React Academy · Урок

Отладка распространённых ошибок React

Диагностируйте предупреждения об отсутствующих ключах, ошибки неопределённого состояния и ошибки гидратации

«Отладка распространённых ошибок React» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

В этом уроке вы научитесь находить самые распространённые ошибки React: предупреждения об отсутствующих ключах, ошибки с неопределённым состоянием, слишком большое количество повторных render и несоответствия при гидратации.

Предупреждение об отсутствующем ключе

React записывает в журнал: *Каждый дочерний элемент списка должен иметь уникальное свойство "ключ".* Это происходит, когда вы выводите массив, не добавив свойство `key`. Исправьте это, добавив стабильный уникальный ключ каждому элементу списка.
// Bad
items.map(item => <li>{item.name}</li>)

// Good
items.map(item => <li key={item.id}>{item.name}</li>)

Невозможно прочитать свойства неопределённого значения

Такая ошибка часто означает, что при первом render ваше состояние имеет значение `undefined`. Всегда инициализируйте состояние безопасным значением по умолчанию (`[]` для массивов, `{}` для объектов, `null` для значений, которые вы проверяете перед использованием).
// Bad — crashes if data is undefined
const [data, setData] = useState();
return <p>{data.name}</p>;

// Good
const [data, setData] = useState(null);
return data ? <p>{data.name}</p> : <p>Loading...</p>;

Ошибка слишком большого количества повторных render

React выдаёт ошибку *Слишком много повторных render*, когда компонент попадает в бесконечный цикл render — обычно потому, что вы безусловно вызываете `setState` во время render или напрямую передаёте свойству встроенную функцию `() => setState(...)`, которая срабатывает при каждом render.
// Bad — setState called on every render
function Counter() {
  const [n, setN] = useState(0);
  setN(n + 1); // infinite loop!
  return <p>{n}</p>;
}

Исправление слишком большого количества повторных render

Перенесите обновления состояния в обработчики событий или в useEffect. Никогда не вызывайте setState непосредственно на верхнем уровне тела компонента.
// Good — update only on click
function Counter() {
  const [n, setN] = useState(0);
  return <button onClick={() => setN(n + 1)}>{n}</button>;
}

Предупреждение о несоответствии при гидратации

В приложениях SSR React выдаёт предупреждение: *Ошибка гидратации: начальный пользовательский интерфейс не совпадает с тем, что было выведено на сервере.* Распространённые причины: использование `Date.now()` или `Math.random()` во время render либо внедрение HTML расширениями браузера.

Исправление несоответствий при гидратации

Перенесите динамические значения (временные метки и случайные ID) в `useState`, инициализированный внутри `useEffect`, чтобы сервер всегда выводил статическое значение, а клиент обновлял его после монтирования.
const [ts, setTs] = useState('');
useEffect(() => {
  setTs(Date.now().toString());
}, []);
return <p>{ts}</p>;

Состояние обновляется не сразу

Помните, что `setState` выполняется асинхронно. Запись состояния в журнал сразу после вызова показывает старое значение. Чтобы увидеть обновлённое значение, записывайте его в журнал внутри `useEffect`, указав переменную состояния в списке зависимостей.
const [count, setCount] = useState(0);

function handleClick() {
  setCount(count + 1);
  console.log(count); // still old value!
}

useEffect(() => {
  console.log('updated:', count); // correct
}, [count]);

Компонент не обновляется при изменении свойства

Если компонент не обновляется при изменении свойства, проверьте, не изменяете ли вы объект или массив непосредственно. React использует равенство ссылок: изменение существующего объекта не вызывает повторный render.
// Bad — same reference, no re-render
const list = [];
list.push('item');
setList(list);

// Good — new array reference
setList([...list, 'item']);

Чтение ошибок в окне наложения ошибки

Когда приложение React завершается с ошибкой в режиме разработки, в браузере появляется окно наложения ошибки. Прочитайте **стек компонентов** внизу: в нём показан каждый компонент, который выполнил render компонента с ошибкой, поэтому источник ошибки становится понятен.

Быстрая проверка

Какова наиболее распространённая причина ошибки React «Слишком много повторных render»?

Итоги

Теперь вы умеете исправлять самые распространённые ошибки React: добавлять стабильные ключи в списки, безопасно инициализировать состояние, избегать вызова setState во время render, обрабатывать несоответствия при гидратации и читать стек компонентов в окне наложения ошибки.

Курс завершён

Поздравляем! Вы завершили курс **React DevTools и отладка**. Теперь вы умеете устанавливать DevTools, проверять деревья компонентов и состояние, профилировать render и находить наиболее распространённые ошибки React во время выполнения.

Часто задаваемые вопросы

Урок «Отладка распространённых ошибок React» бесплатный?

Да — полный текст урока «Отладка распространённых ошибок React» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Отладка распространённых ошибок React»?

Диагностируйте предупреждения об отсутствующих ключах, ошибки неопределённого состояния и ошибки гидратации Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Отладка распространённых ошибок React»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Установка и открытие React DevTools
  2. Изучение дерева компонентов и props
  3. Использование вкладки профилировщика
  4. Отладка распространённых ошибок React
← Назад к React Academy