PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Каких антипаттернов избегать при создании таблицы с подкомпонентами?

Компоненты

Таблица с подкомпонентами (строки, ячейки, раскрывающиеся панели) — место, где антипаттерны React бьют больнее всего: всё умножается на количество строк.

Антипаттерны производительности

Компоненты, объявленные внутри рендера:

const Table = ({ rows }) => {
  const Row = ({ row }) => <tr>...</tr>; // ❌ новый ТИП каждый рендер
  // React размонтирует и пересоздаёт все строки при каждом рендере таблицы
};

Подкомпоненты объявлять на верхнем уровне модуля.

key по индексу при сортировке/фильтрации/удалении: состояние строк (чекбоксы, раскрытие, инпуты) «переезжает» к чужим данным. Только стабильные id.

Нестабильные props строк: инлайн-колбэки и объекты (onSelect={() => ...}, style={{...}}) ломают React.memo строк — при вводе в поисковую строку перерисовываются все 500 строк. Лечение: React.memo(Row) + useCallback с id-аргументом (onSelect(row.id) внутри строки) + useMemo для конфигов.

Без виртуализации на больших данных: тысячи смонтированных строк — тормоза независимо от мемоизации; react-window/react-virtuoso или пагинация.

Состояние всех строк в родителе: раскрытие/hover каждой строки в одном объекте state таблицы — любое изменение рендерит всё. Локальный state в строке (или нормализованный стор с точечными подписками).

Антипаттерны структуры

  • Невалидная вложенность: <div> внутри <tr> (нужны td/th; группы строк — <React.Fragment key>), текст/пробелы прямо в <table> — React предупреждает про hydration.
  • «Таблица-бог»: логика сортировки/фильтрации/выделения в одном компоненте — выносить в хуки (useTableSort) или взять headless-библиотеку (TanStack Table).
  • Данные-производные в state (отсортированная копия рядом с исходной) — рассинхрон; вычислять useMemo.

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

Не объявлять подкомпоненты в рендере (пересоздание строк), key — только стабильные id (не индексы), мемоизировать строки + стабилизировать их props, виртуализировать большие списки, состояние строки держать в строке, соблюдать валидную структуру table (Fragment для групп) и выносить логику в хуки/TanStack Table.

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