# Таблица

Таблица данных. Поддерживаются сортировка (управляемая / неуправляемая), фильтрация столбцов, перетаскивание ширины столбцов, многоуровневые заголовки (бесконечная вложенность children) и фиксированные столбцы; при заданном height включается виртуальная прокрутка (rowHeight должен совпадать с фактической высотой строки).

Таблица
<template>
  <div style="max-width: 760px">
    <p class="demo-note">size="small" + maxHeight + сортировка по умолчанию (defaultSortProp/defaultSortOrder) + фильтрация</p>
    <LhTable
      :data="rows"
      :columns="columns"
      size="small"
      stripe
      border
      :max-height="200"
      row-key="name"
      default-sort-prop="dynasty"
      default-sort-order="asc"
      :default-filtered-values="{ dynasty: ['Сун'] }"
    >
      <template #price="{ value }">
        <span style="color: var(--lh-primary-color); font-weight: 600">{{ value }}</span>
      </template>
    </LhTable>
    <p class="demo-note">Столбец «Династия» по умолчанию отсортирован по возрастанию и предфильтрован по значению «Сун»; условия можно изменить кнопкой фильтра в заголовке.</p>
    <p class="demo-note" style="margin-top: 16px">Вложенный заголовок (children) + перетаскивание ширины (resizable) + formatter + пользовательский sorter</p>
    <LhTable :data="rows2" :columns="groupColumns" border :height="180" :row-height="40" :sorter="dynastySorter">
      <template #price="{ value }">
        <span style="color: var(--lh-primary-color); font-weight: 600">{{ value }}</span>
      </template>
    </LhTable>
    <p class="demo-note">Столбец «Происхождение» форматируется функцией formatter в «Дворц. коллекция / Частная коллекция»; ширину столбца «Оценка» можно менять перетаскиванием (resizable).</p>
  </div>
</template>

<script>
export default {
  data: () => ({
    rows: [
      { name: 'Путешествие по горам и рекам', dynasty: 'Сун', price: 1800 },
      { name: 'Жилище в горах Фучунь', dynasty: 'Юань', price: 2600 },
      { name: 'Тысяча ли рек и гор', dynasty: 'Сун', price: 3200 },
      { name: 'Праздник Цинмин на реке', dynasty: 'Сун', price: 1500 },
      { name: 'Ночной пир Хань Сицзая', dynasty: 'Пять династий', price: 2100 },
    ],
    rows2: [
      { name: 'Путешествие по горам и рекам', dynasty: 'Сун', provenance: 'Дворц. коллекция', price: 1800 },
      { name: 'Жилище в горах Фучунь', dynasty: 'Юань', provenance: 'Дворц. коллекция', price: 2600 },
      { name: 'Праздник Цинмин на реке', dynasty: 'Сун', provenance: 'Дворц. коллекция', price: 1500 },
      { name: 'Светлый белый Чжао Е Бай', dynasty: 'Тан', provenance: 'Частная коллекция', price: 980 },
    ],
    columns: [
      { prop: 'name', label: 'Произведение', width: 160 },
      {
        prop: 'dynasty',
        label: 'Династия',
        width: 120,
        sortable: true,
        filters: [
          { text: 'Сун', value: 'Сун' },
          { text: 'Юань', value: 'Юань' },
          { text: 'Пять династий', value: 'Пять династий' },
        ],
      },
      { prop: 'price', label: 'Оценка (в 10 тыс.)', width: 140, align: 'right', slot: 'price' },
    ],
    groupColumns: [
      {
        label: 'Сведения о коллекции',
        children: [
          { prop: 'name', label: 'Произведение', width: 150 },
          {
            prop: 'provenance',
            label: 'Происхождение',
            width: 100,
            formatter: (r) => (r.provenance === 'Дворц. коллекция' ? 'Дворц. коллекция' : 'Частная коллекция'),
          },
        ],
      },
      {
        label: 'Оценка',
        children: [
          { prop: 'dynasty', label: 'Династия', width: 90, sortable: true },
          { prop: 'price', label: 'Оценка (в 10 тыс.)', width: 130, align: 'right', resizable: true, slot: 'price' },
        ],
      },
    ],
  }),
  methods: {
    dynastySorter(a, b) {
      const order = ['Тан', 'Пять династий', 'Сун', 'Юань']
      return order.indexOf(String(a.dynasty)) - order.indexOf(String(b.dynasty))
    },
  },
}
</script>

# Props

Проп Описание Тип По умолчанию
data Данные строк LhTableRow[] []
columns Конфигурация столбцов LhTableColumn[] []
height Высота тела таблицы (при задании включается виртуальная прокрутка; число — px) number \| string —
maxHeight Максимальная высота в невиртуальном режиме number \| string —
rowHeight Высота строки при виртуальной прокрутке (должна совпадать с фактической высотой строки) number —
stripe / border Зебра / границы ячеек boolean false
size Размер 'small' \| 'default' \| 'large' 'default'
rowKey Имя поля-ключа строки string —
defaultSortProp / defaultSortOrder Столбец / направление сортировки по умолчанию string / LhTableSortOrder —
sorter Пользовательская функция сортировки (a, b) => number —
resizable Включить перетаскивание ширины столбцов (требуется сочетание с column-уровневым resizable, и столбец должен иметь числовой width) boolean false
defaultFilteredValues Состояние фильтра по умолчанию (неуправляемое; ключи — prop столбцов) Record<string, (string \| number)[]> —
filteredValues Управляемое состояние фильтра (:filtered-values.sync) Record<string, (string \| number)[]> —
sx Компактная раскладка через sx — —

# Events

sortChange ({ prop, order }), filterChange ({ prop, values }), columnResize ({ prop, width }), update:filteredValues, rowClick (row, index)

# Slots

Слот Описание
<имя slot столбца> Пользовательская ячейка, областные параметры { row, column, index, value } (столбец задаётся через column.slot)
empty Содержимое при отсутствии данных (по умолчанию «Нет данных»)

# Доступность

Заголовок — role="row" + aria-sort для сортируемых столбцов, тело таблицы — role="row"; панель фильтра — role="menu", рукоятке изменения ширины заданы aria-label и tabindex, поддерживается регулирование стрелками влево / вправо.

Copyright © 2024-2026 FengMo WenXue