Паттерны
Навигация в духе электронной таблицы
Когда использовать:
пользователи перемещаются по плотной матрице с клавиатуры.
Заметки по композиции:
Задавайте координаты строк и ячеек явно и выбирайте поведение переноса осознанно.
Компромиссы:
Мощное управление с клавиатуры, но интеграция сложнее, чем у статичной таблицы.
import {
DataGrid,
DataGridCell,
DataGridRow,
DataGridRowGroup,
} from '@vega-ui/react';
import './examples.css';
const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'];
const rota = [
{ name: 'Maya Chen', shifts: ['Day', 'Day', 'Off', 'Night', 'Night'] },Разреженная сетка планировщика
Когда использовать:
в визуальной раскладке есть намеренные пробелы.
Заметки по композиции:
Отрисовывайте только существующие ячейки: отсутствующие столбцы вертикальное движение пропускает само. exclude оставьте для ячеек, которые видны, но не должны получать фокус.
Компромиссы:
Навигация следует реальным данным без лишнего учёта, но во всех строках одинаковый индекс столбца должен означать одно и то же.
import { useState } from 'react';
import {
DataGrid,
DataGridCell,
DataGridRow,
DataGridRowGroup,
Text,
} from '@vega-ui/react';
import './examples.css';
const year = 2026;
const months = Array.from({ length: 12 }, (_, month) => month);Контролируемая активная ячейка
Когда использовать:
родительскому сценарию нужно синхронизировать позицию в сетке с другими частями интерфейса.
Заметки по композиции:
Храните состояние active в родителе. Изменение active переносит только позицию табуляции; когда внешний контрол должен перенести и фокус, сфокусируйте ячейку через apiRef.
Компромиссы:
Больше контроля, но и больше работы по согласованию состояния.
import { useRef, useState } from 'react';
import {
Button,
DataGrid,
DataGridCell,
DataGridRow,
DataGridRowGroup,
Text,
type DataGridApiRef,
} from '@vega-ui/react';
import './examples.css';
Сравнение
Быстрое правило выбора
Выбирайте DataGrid, когда навигация с клавиатуры между отдельными ячейками — часть основного взаимодействия.
DataGrid или Table
Используйте DataGrid, когда:
- ячейкам нужно управление активным фокусом
- важно взаимодействие в духе электронной таблицы
Используйте Table, когда:
- содержимое в основном статичное
- семантическое чтение таблицы важнее навигации по ячейкам
DataGrid или DataGridSelectable
Используйте DataGrid, когда:
- достаточно базовой навигации
- выбор должен оставаться вне слоя сетки
Используйте DataGridSelectable, когда:
- выбор строк или ячеек — часть UX
DataGrid или DataGridPicker
Используйте DataGrid, когда:
- главная задача — навигация по сетке
Используйте DataGridPicker, когда:
- сетка служит поверхностью выбора значения, а не общей системой навигации по ячейкам
Выбирайте этот компонент, когда
- перемещение с клавиатуры между ячейками задумано намеренно
- сетка — скорее модель взаимодействия, чем статичная таблица
- производные слои выбора или пикера были бы преждевременны
Не выбирайте этот компонент, когда
- достаточно семантической
Table - пользователю не нужна навигация по активной ячейке
- сценарии выбора лучше реализуют производные семейства сетки
Решение проблем
Навигация с клавиатуры работает странно
Симптом
Активная ячейка перемещается не так, как выглядит видимая сетка.
Вероятная причина
Режим переноса или правила исключений не совпадают с отрендеренной раскладкой.
Как проверить
- посмотрите
wrap - посмотрите
exclude - сравните видимую матрицу с путём навигации с клавиатуры
Решение
- согласуйте правила исключений с реальными пустыми ячейками
- выберите подходящий для продуктового сценария режим
wrap
Активная ячейка не синхронизируется с родителем
Симптом
Интерфейс вроде бы меняет активную ячейку, но состояние родителя отстаёт или расходится.
Вероятная причина
Контролируемое активное состояние не опирается на единый источник истины.
Как проверить
- посмотрите
active - посмотрите
onChangeActive
Решение
- храните
activeв одном источнике состояния у родителя - передавайте этот же источник в
DataGrid
Интерактивное содержимое ячеек ломает работу с клавиатуры
Симптом
Кнопки или кастомные виджеты внутри ячейки мешают навигации по сетке.
Вероятная причина
Содержимое ячейки конкурирует с собственной моделью фокуса сетки.
Как проверить
- перейдите в сетку по Tab
- перемещайтесь с клавиатуры
- проверьте взаимодействие с содержимым ячейки
Решение
- сначала упростите содержимое ячейки
- возвращайте интерактивные контролы, только если модель клавиатуры по-прежнему работает