Data Table

Data Table - это полнофункциональный компонент таблицы, построенный на базе TanStack Table и интегрированный с React Query для асинхронной загрузки данных. Компонент предоставляет богатый набор возможностей для работы с табличными данными, включая drag-and-drop сортировку столбцов, фильтрацию, пагинацию, выбор строк и экспорт данных.


Import

Usages

Базовый пример использования примитивов таблицы

Основные возможности

Интеграция с TanStack Table

DataTableRoot интегрирует TanStack Table и React Query для работы с динамическими данными.

Важно: DataTableRoot требует обертки в QueryClientProvider из @tanstack/react-query и NuqsAdapter из nuqs/adapters/react для работы с URL параметрами.

Пагинация

Полноценная пагинация с настройкой размера страницы, быстрым переходом и отображением общего количества.

Изменение порядка столбцов

Drag-and-drop для изменения порядка столбцов с автоматическим сохранением в localStorage или API.

Управление видимостью столбцов

Управляйте видимостью столбцов через удобный интерфейс редактирования.

Фильтрация данных

Гибкая система фильтрации с поддержкой различных типов фильтров: текст, селект, дата, диапазон.

Выбор строк и массовые действия

Выбирайте строки и выполняйте массовые операции над выбранными данными.

Экспорт данных

Экспортируйте данные таблицы в форматы CSV или Excel одним кликом.

Peer Dependencies: Для работы экспорта необходимо установить papaparse и xlsx как peer dependencies.

Раскрываемые строки

Добавьте дополнительный контент, который раскрывается при клике на строку.

Стилизация

Sizes

Data Table поддерживает три размера: sm, md (по умолчанию) и lg.

Striped

Чередующиеся цвета строк для лучшей читаемости.

Хранение состояния

LocalStorage

Автоматическое сохранение порядка и видимости столбцов в localStorage:

API Storage

Сохранение состояния таблицы на сервере с автоматическим fallback на localStorage:

React Query конфигурация

Query Options

Свойство queryOptions может быть объектом или функцией, принимающей параметры пагинации и сортировки:

Формат ответа

По умолчанию компонент ожидает ответ в формате Hydra:

Вы можете изменить ключи через свойство defaultTotalCountKey:

Фильтрация

Типы фильтров

Data Table поддерживает следующие типы фильтров:

Интеграция фильтров с URL

Фильтры автоматически синхронизируются с URL параметрами через nuqs, что позволяет:

  • Делиться ссылками с активными фильтрами
  • Использовать кнопки "Назад/Вперед" браузера
  • Сохранять состояние при перезагрузке страницы

Свойства

DataTablePrimitives Props

АтрибутТипОписаниеПо умолчанию
size"sm" | "md" | "lg"Размер таблицы"md"
stripedbooleanЧередующиеся цвета строкfalse
borderedbooleanОтображать границыtrue
hoverablebooleanЭффект при наведенииtrue
isScrollablebooleanГоризонтальная прокруткаfalse
isExpandablebooleanПоддержка раскрываемых строкfalse
classNamestringДополнительные CSS классы-

DataTableRoot Props

АтрибутТипОписаниеПо умолчанию
columnsColumnDef<TData>[]Определение столбцов TanStack Table (обязательное)-
queryOptionsUseQueryOptions | ((params) => UseQueryOptions)Опции для React Query (обязательное)-
initialPagination{ pageIndex: number; pageSize: number; pageSizes?: number[] }Начальные настройки пагинации{ pageIndex: 1, pageSize: 10 }
showPageJumpbooleanПоказать поле быстрого переходаtrue
showTotalCountbooleanПоказать общее количество записейfalse
showPageSizeSelectorbooleanПоказать селектор размера страницыtrue
defaultTotalCountKeystringКлюч для общего количества в ответе API"hydra:totalItems"

Порядок столбцов

АтрибутТипОписание
isCanDragbooleanВключить drag-and-drop для столбцов
columnOrderStorageKeystringКлюч для хранения порядка
columnOrderStorageType"local" | "api"Тип хранилища
externalColumnOrderstring[]Внешний порядок столбцов (для API)
onColumnOrderApiLoad() => Promise<string[] | null>Загрузка порядка из API
onColumnOrderApiSave(order: string[]) => Promise<void>Сохранение порядка в API
onColumnOrderStorageError(error: Error) => voidОбработка ошибок хранилища

Видимость столбцов

АтрибутТипОписание
withEditingbooleanВключить управление видимостью
columnVisibilityStorageKeystringКлюч для хранения видимости
columnVisibilityStorageType"local" | "api"Тип хранилища
externalColumnVisibilityVisibilityStateВнешнее состояние видимости (для API)
onColumnVisibilityApiLoad() => Promise<VisibilityState | null>Загрузка видимости из API
onColumnVisibilityApiSave(visibility: VisibilityState) => Promise<void>Сохранение видимости в API
onColumnVisibilityStorageError(error: Error) => voidОбработка ошибок хранилища

Фильтрация

АтрибутТипОписание
filtersDataTableFilter[]Определение доступных фильтров
texts{ filterButtonLabel?: string; filterApplyButtonLabel?: string; filterCancelButtonLabel?: string }Тексты для UI фильтров

Выбор строк

АтрибутТипОписание
selectedActionsSelectedAction[]Действия для выбранных строк
rowIdKeykeyof TDataКлюч для ID строки
customRender(selectedRows: string[]) => ReactNodeКастомный рендер панели выбранных строк

Экспорт

АтрибутТипОписание
withExportbooleanВключить экспорт данных
exportFilenamestringИмя файла для экспорта
texts{ exportButton?: string; exportCsv?: string; exportExcel?: string }Тексты для UI экспорта
onCustomExportCsv(data: TData[]) => voidКастомная логика экспорта CSV
onCustomExportExcel(data: TData[]) => voidКастомная логика экспорта Excel

Раскрываемые строки

АтрибутТипОписание
getRowCanExpand(row: Row<TData>) => booleanФункция определения возможности раскрытия
renderSubComponent(props: { row: Row<TData> }) => ReactElementРендер содержимого раскрытой строки

Прочее

АтрибутТипОписание
startContentReactNodeКонтент в начале таблицы
endContentReactNodeКонтент в конце таблицы
drawerPropsDrawerPropsСвойства для Drawer (при использовании withEditing)
paginationPropsOmit<PaginationProps, 'total' | 'page' | 'onChange'>Дополнительные свойства для пагинации

Типы

DataTableFilter

SelectedAction

Примеры использования

С дженериками для типобезопасности

Кастомизация ячеек с TanStack Table

Accessibility

  • Используйте aria-label для описания таблицы
  • Все интерактивные элементы доступны с клавиатуры
  • Поддержка screen readers через семантические HTML элементы
  • Фокус управляется корректно при навигации

Best Practices

  1. Всегда указывайте id для столбцов при использовании drag-and-drop или управления видимостью
  2. Используйте useMemo для columns чтобы избежать лишних ререндеров
  3. Оборачивайте в QueryClientProvider и NuqsAdapter для корректной работы
  4. Используйте типы TypeScript для type-safety при работе с данными
  5. Настройте обработку ошибок для API storage с fallback на localStorage