0Pricing
React Academy · Урок

Лучшие практики для ключей и ссылок

Используйте стабильные ключи, избегайте проблем с индексом в роли ключа и работайте со ссылками-колбэками

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

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

В этом уроке вы узнаете, как правильно использовать ключи списков, почему использование индекса массива в качестве ключа вызывает ошибки и как работать со ссылками обратного вызова и передаваемыми ссылками.

Почему ключи важны

React использует свойства `key`, чтобы отслеживать, какие элементы списка изменились, были добавлены или удалены между render. Правильный ключ позволяет React повторно использовать существующие узлы DOM, а неправильный ключ вызывает ненужные размонтирования и повторные монтирования.

Стабильные уникальные ключи

Лучший ключ — это стабильный уникальный ID из ваших данных, например ID строки базы данных или UUID. Этот ключ должен быть уникальным только среди соседних элементов, а не во всей странице.
users.map(user => (
  <UserCard key={user.id} user={user} />
))

Почему индекс в качестве ключа создаёт проблемы

Использование индекса массива в качестве ключа хорошо работает для статических списков, но вызывает ошибки в отсортированных или отфильтрованных списках. При изменении порядка элементов React сопоставляет компоненты по индексу и повторно использует неправильные узлы DOM, из-за чего повреждаются значения полей ввода и состояние анимации.
// Risky when list can reorder or filter
items.map((item, i) => <Row key={i} {...item} />)

Когда индекс в качестве ключа допустим

Индекс в качестве ключа допустим только в следующих случаях: (1) список никогда не меняет порядок и не фильтруется, (2) у элементов нет стабильного ID и (3) у элементов нет локального состояния, например значений полей ввода. Для статических списков отображения это подходит.

Создание стабильных ID

Если в ваших данных нет ID, создайте его в момент создания элемента, а не во время render. Можно использовать `crypto.randomUUID()` или библиотеку `nanoid`.
const newItem = { id: crypto.randomUUID(), text: 'Buy milk' };

Основы useRef

`useRef` возвращает изменяемый объект, значение `.current` которого сохраняется между render и не вызывает повторный render. Его используют для хранения ссылок на узлы DOM и изменяемых значений, например ID таймеров.
const inputRef = useRef(null);
<input ref={inputRef} />
// Access DOM node: inputRef.current.focus();

Ссылки обратного вызова

Вместо объекта ссылки можно передать **ссылку обратного вызова** — функцию, которую React вызывает с узлом DOM при его монтировании и со значением `null` при размонтировании. Это позволяет настроить логику точно в момент, когда узел становится доступен.
function Input() {
  return (
    <input
      ref={node => {
        if (node) node.focus();
      }}
    />
  );
}

forwardRef для ссылок компонентов

Функциональные компоненты не принимают `ref` как обычное свойство. Оберните компонент в `React.forwardRef`, чтобы родительские компоненты могли прикрепить ссылку к внутреннему узлу DOM.
const FancyInput = React.forwardRef((props, ref) => (
  <input ref={ref} className="fancy" {...props} />
));

// Parent
const inputRef = useRef(null);
<FancyInput ref={inputRef} />

useImperativeHandle

Если родитель хранит ссылку на дочерний компонент, с помощью `useImperativeHandle` можно точно контролировать, что этот компонент предоставляет наружу. Это сохраняет внутренний DOM дочернего компонента закрытым и предоставляет чистый императивный интерфейс.
const Child = forwardRef((_, ref) => {
  const innerRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => innerRef.current.focus(),
  }));
  return <input ref={innerRef} />;
});

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

Почему следует избегать использования индекса массива в качестве ключа в списке, порядок которого может измениться?

Итоги

Используйте стабильные ID из данных в качестве ключей, избегайте ключей-индексов в динамических списках, применяйте useRef для доступа к DOM и хранения изменяемых значений, используйте ссылки обратного вызова для логики монтирования и размонтирования, а forwardRef — для передачи ссылок из дочерних компонентов.

Далее

Следующий урок: **Структура папок и соглашения об именовании** — вы организуете проект React с папками по функциональным возможностям и единообразными именами файлов.

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

Урок «Лучшие практики для ключей и ссылок» бесплатный?

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

Чему я научусь в уроке «Лучшие практики для ключей и ссылок»?

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

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

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

Сколько времени занимает урок «Лучшие практики для ключей и ссылок»?

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

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

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

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

  1. Что делает StrictMode
  2. Чистые компоненты и отказ от побочных эффектов при отрисовке
  3. Лучшие практики для ключей и ссылок
  4. Структура папок и соглашения об именовании
← Назад к React Academy