Другое

Как легко отображать массивы в ячейках ag-Grid

Узнайте простые методы отображения массивов в ячейках ag-Grid без сложных cellRenderers или динамических расчетов высоты строк. Изучите встроенные форматтеры, CSS-техники и умные подходы к рендерингу для лучшей производительности сетки.

Как отобразить массив в ячейке ag-Grid

Я хочу отобразить массив значений в ячейке ag-Grid. Я могу использовать cellRenderer в определении столбца, чтобы объединить значения массива:

javascript
cellRenderer: params => params.value.join('<br>')

Если я делаю это, мне также нужно динамически изменять rowHeight в объекте gridOption:

javascript
getRowHeight: params => params.data.my_values.length * 40

Этот подход кажется громоздким. Есть ли более простой способ отображать массивы в ячейках ag-Grid? Пример реализации был бы очень полезен.

Простейший способ отображения массивов в ячейках ag-Grid - использование autoGroupColumnDef с aggFunc для группировки или реализация пользовательского cellRenderer, который элегантно форматирует массивы без необходимости динамической регулировки высоты строк. Современные версии ag-Grid также поддерживают aggFunc, который может автоматически форматировать массивы в читаемые строки без ручных операций join.

Содержание

Понимание вызовов отображения массивов

При работе с массивами в ag-Grid вы сталкиваетесь с несколькими вызовами:

  1. Поведение по умолчанию: Массивы отображаются как строки, разделенные запятыми, что может быть визуально непривлекательно
  2. Динамическое содержимое: Длины массивов различаются, что требует гибкого рендеринга ячеек
  3. Стилизация: Правильное форматирование и стилизация элементов массива
  4. Производительность: Баланс между визуальной насыщенностью и производительностью сетки

Подход, который вы упомянули с использованием join('<br>') с динамической высотой строк работает, но имеет недостатки:

javascript
// Текущий подход - работает, но громоздко
cellRenderer: params => params.value.join('<br>'),
getRowHeight: params => params.data.my_values.length * 40

Этот метод заставляет каждый элемент массива начинаться с новой строки, но требует явных расчетов высоты строк и может привести к проблемам с производительностью при больших объемах данных.

Простые методы отображения массивов

Метод 1: Использование встроенных форматировщиков

ag-Grid предоставляет встроенные форматировщики, которые могут обрабатывать массивы без пользовательских cellRenderer:

javascript
columnDefs: [
  {
    field: 'my_values',
    valueFormatter: params => {
      if (!params.value || !Array.isArray(params.value)) return params.value;
      return params.value.join(', '); // Простое разделение запятыми
    }
  }
]

Метод 2: Многострочное отображение на основе CSS

Используйте CSS для создания многострочного отображения без JavaScript:

javascript
columnDefs: [
  {
    field: 'my_values',
    valueFormatter: params => {
      return Array.isArray(params.value) ? 
        params.value.join(' \A ') : params.value;
    },
    cellStyle: { whiteSpace: 'pre-wrap' }
  }
]

Последовательность экранирования CSS \A создает разрывы строк, а whiteSpace: 'pre-wrap' обеспечивает правильное отображение.

Продвинутые техники форматирования массивов

Пользовательский CellRenderer с умным форматированием

Создайте повторно используемый cellRenderer, который умно обрабатывает массивы:

javascript
const arrayCellRenderer = (params) => {
  if (!params.value || !Array.isArray(params.value)) {
    return params.value;
  }

  if (params.value.length === 0) return '';
  
  // Для небольших массивов используйте отображение в одну строку
  if (params.value.length <= 3) {
    return params.value.join(', ');
  }
  
  // Для больших массивов показывайте первые несколько элементов с указанием количества
  const firstThree = params.value.slice(0, 3);
  return `${firstThree.join(', ')} (+${params.value.length - 3} еще)`;
};

Использование:

javascript
columnDefs: [
  {
    field: 'my_values',
    cellRenderer: arrayCellRenderer
  }
]

CellRenderer на основе шаблонов

Для более сложного форматирования:

javascript
const templateCellRenderer = (params) => {
  if (!params.value || !Array.isArray(params.value)) {
    return params.value;
  }

  return `
    <div class="array-container">
      ${params.value.map(item => 
        `<span class="array-item">${item}</span>`
      ).join('')}
    </div>
  `;
};

С соответствующим CSS:

css
.array-container {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}

.array-item {
  background: #f0f0f0;
  padding: 2px 6px;
  border-radius: 3px;
  font-size: 12px;
}

Рассмотрения производительности

При отображении массивов учитывайте эти аспекты производительности:

  1. Большие массивы: Избегайте прямого отображения extremely длинных массивов
  2. Виртуальная прокрутка: ag-Grid автоматически обрабатывает это
  3. Частота рендеринга ячеек: Кэшируйте ресурсоемкие операции

Для лучшей производительности с большими массивами:

javascript
const optimizedArrayRenderer = (params) => {
  if (!params.value || !Array.isArray(params.value)) {
    return params.value;
  }

  // Ограничьте отображение первыми 10 элементами для производительности
  const displayItems = params.value.slice(0, 10);
  const remaining = params.value.length - displayItems.length;
  
  if (remaining > 0) {
    return `${displayItems.join(', ')} (+${remaining} элементов)`;
  }
  
  return displayItems.join(', ');
};

Полная реализация примера

Вот полный рабочий пример:

javascript
// Определите параметры сетки
const gridOptions = {
  columnDefs: [
    {
      headerName: 'ID',
      field: 'id',
      width: 80
    },
    {
      headerName: 'Значения массива',
      field: 'my_values',
      cellRenderer: arrayCellRenderer,
      autoHeight: true // Включите автоматическую высоту строки
    }
  ],
  rowData: [
    { id: 1, my_values: ['Яблоко', 'Банан', 'Вишня'] },
    { id: 2, my_values: ['Красный', 'Зеленый', 'Синий', 'Желтый', 'Фиолетовый'] },
    { id: 3, my_values: [] },
    { id: 4, my_values: ['Один элемент'] },
    { id: 5, my_values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] }
  ],
  enableCellTextSelection: true,
  suppressRowClickSelection: true
};

// Умный cellRenderer для массивов
function arrayCellRenderer(params) {
  if (!params.value || !Array.isArray(params.value)) {
    return params.value;
  }

  const items = params.value;
  
  // Обработка пустого массива
  if (items.length === 0) return '';
  
  // Обработка одного элемента
  if (items.length === 1) return items[0];
  
  // Обработка небольших массивов (2-5 элементов)
  if (items.length <= 5) {
    return items.join(' • ');
  }
  
  // Обработка средних массивов (6-15 элементов)
  if (items.length <= 15) {
    return items.slice(0, 5).join(' • ') + ` (+${items.length - 5} еще)`;
  }
  
  // Обработка больших массивов
  return items.slice(0, 3).join(' • ') + ` (+${items.length - 3} элементов)`;
}

// Создайте сетку
const gridDiv = document.querySelector('#myGrid');
new agGrid.Grid(gridDiv, gridOptions);

С CSS:

css
/* Стилизация элементов массива */
.ag-cell {
  line-height: 1.4;
}

/* Дополнительно: Добавьте эффекты при наведении для элементов массива */
.ag-cell:hover {
  cursor: text;
}

Лучшие практики

  1. Выбирайте подходящие методы отображения в зависимости от размера массива и типа содержимого
  2. Используйте autoHeight вместо ручных расчетов высоты строк, когда это возможно
  3. Реализуйте умное усечение для больших массивов для поддержания производительности
  4. Учитывайте доступность - убедитесь, что содержимое массива можно выбрать и что оно доступно для скринридеров
  5. Тестируйте с разными сценариями данных, включая пустые массивы, одиночные элементы и большие массивы
  6. Кэшируйте часто используемые рендереры, чтобы избежать повторного создания функций
  7. Используйте CSS для стилизации вместо встроенных стилей, когда это возможно

Для наиболее распространенных случаев использования простой подход с valueFormatter часто достаточен и хорошо работает:

javascript
columnDefs: [
  {
    field: 'my_values',
    valueFormatter: params => {
      return Array.isArray(params.value) ? 
        params.value.join(' • ') : params.value;
    },
    autoHeight: true
  }
]

Этот подход устраняет необходимость в пользовательских cellRenderer и ручных расчетах высоты строк, обеспечивая чистое и читаемое отображение массивов.

Источники

  1. Документация ag-Grid - Рендеринг ячеек
  2. Документация ag-Grid - Форматировщики значений
  3. Документация ag-Grid - Высота строки
  4. GitHub ag-Grid - Примеры отображения массивов

Заключение

Отображение массивов в ag-Grid не должно быть громоздким. Начните с простых подходов, таких как valueFormatter с пользовательскими разделителями, и рассматривайте более сложные решения только при необходимости. Свойство autoHeight часто устраняет необходимость в ручных расчетах высоты строк. Для большинства приложений умное форматирование массивов, адаптирующееся к размеру содержимого, обеспечивает лучший баланс между читаемостью и производительностью. Всегда тестируйте выбранный подход с реалистичными объемами данных для обеспечения оптимальной производительности сетки.

Авторы
Проверено модерацией
Модерация