Skip to content

Table ​

Таблица с локальной пагинацией, выбором строк, панелью действий над выбранными объектами, изменением ширины и сохраняемым представлением колонок.

Основа компонента

Компонент построен на Table из Ant Design Vue.

В демо можно перетаскивать границы заголовков для изменения ширины. Нажмите на шестерёнку над чекбоксом выбора строк, чтобы скрыть, вернуть или переставить столбцы. Нажатие «Сохранить» запишет настроенный вид в браузере, а «Сбросить вид» вернёт исходные столбцы.

Команда

[выберите вид]
ИмяРольКоманда
АннаАналитикCore
НикитаРазработчикPlatform
МарияДизайнерProduct
vue
<script setup lang="ts">
import { ref } from 'vue'
import { Button, Table } from '@minitwiks/nsmp-vue-components'

const columns = ref([
  { title: 'Имя', dataIndex: 'name', key: 'name', width: 160 },
  { title: 'Роль', dataIndex: 'role', key: 'role', width: 180 },
  { title: 'Команда', dataIndex: 'team', key: 'team', width: 140 },
])

const rows = [
  { key: 1, name: 'Анна', role: 'Аналитик', team: 'Core' },
  { key: 2, name: 'Никита', role: 'Разработчик', team: 'Platform' },
  { key: 3, name: 'Мария', role: 'Дизайнер', team: 'Product' },
]

const selected = ref<typeof rows>([])
</script>

<template>
  <Table
    v-model:columns="columns"
    v-model:selected-objects="selected"
    title="Команда"
    :data-source="rows"
    :pagination="false"
    :min-column-width="90"
    view-storage-key="docs-team-table-view"
    :views="[
      { title: 'Основной вид', columns: columns },
      { title: 'Компактный вид', columns: columns.slice(0, 1) },
    ]"
  >
    <template #selectedObjectsActions>
      <Button type="text" @click="selected = []">Снять выделение</Button>
    </template>
  </Table>
</template>

Действия над выбранными объектами ​

Слот selectedObjectsActions добавляет панель действий над выбранными строками. Отметьте строки в примере выше, чтобы увидеть панель со счётчиком выбранных объектов и кнопкой «Снять выделение».

Панель появляется между верхними инструментами таблицы и строками, только если передан слот и выбрана хотя бы одна строка. При снятии выделения со всех строк или при :selectable="false" она скрывается. Счётчик добавляется автоматически; панель использует Alert без иконки и кнопки закрытия.

Слот не передаёт параметры. Получайте выбранные записи через v-model:selected-objects и используйте их в обработчиках действий. Присваивание пустого массива снимает выделение:

vue
<Table
  :columns="columns"
  :data-source="rows"
  v-model:selected-objects="selected"
>
  <template #selectedObjectsActions>
    <Button type="text" @click="selected = []">Снять выделение</Button>
  </template>
</Table>

Для действий в панели предполагается использование компонента Button с type="text": внутри неё такие кнопки отображаются с обычным начертанием.

Расположение пагинации ​

Пагинацию можно разместить сверху, снизу или одновременно с обеих сторон таблицы. Передайте массив позиций в pagination.position. По умолчанию она отображается снизу слева (['bottomLeft']), по 20 строк на странице.

Чтобы полностью отключить пагинацию, передайте :pagination="false".

Расположениеpagination.position
Только сверху['topLeft']
Только снизу['bottomLeft']
Сверху и снизу['topLeft', 'bottomLeft']

Изменение ширины столбцов ​

Ширину столбца можно изменить перетаскиванием его правой границы. Возможность включена по умолчанию и управляется prop resizableColumns. Ширина перераспределяется между текущим и следующим столбцами, поэтому отдельный маркер изменения размера не добавляется последнему столбцу.

Изменение ширины защищено значением minColumnWidth, которое по умолчанию равно 70 пикселям. Компонент ограничивает движение границы сразу с двух сторон: текущий и соседний столбцы не смогут стать уже допустимого минимума. Благодаря этому изменение ширины не ломает структуру таблицы и не схлопывает содержимое.

vue
<Table
  :columns="columns"
  :data-source="rows"
  :min-column-width="90"
  resizable-columns
/>

Для отдельного столбца изменение ширины можно отключить с помощью resizable: false. После завершения перетаскивания компонент вызывает событие columnResize и обновляет v-model:columns.

Сохраняемые виды отображения ​

Prop viewStorageKey включает настройку и сохранение вида таблицы. В окне настройки пользователь может:

  • скрывать ненужные столбцы;
  • возвращать скрытые столбцы;
  • менять порядок столбцов перетаскиванием или кнопками со стрелками;
  • сбрасывать вид к исходной конфигурации.

После нажатия «Сохранить» компонент записывает в localStorage выбранные столбцы, их правильный порядок и текущую ширину. При следующем открытии страницы вид восстанавливается автоматически. Для надёжного сопоставления сохранённых настроек каждому столбцу рекомендуется задавать стабильный уникальный key.

vue
<Table
  v-model:columns="columns"
  :data-source="employees"
  view-storage-key="employees-table-view"
/>

Разным таблицам или независимым видам нужно передавать разные ключи. Если в коде позже появится новый столбец, которого не было в сохранённом состоянии, компонент сохранит существующий пользовательский порядок и добавит новый столбец после восстановленных.

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

vue
<Table
  v-model:columns="columns"
  :data-source="employees"
  show-view-select
  :views="[
    { title: 'Основной вид', columns: columns },
    { title: 'Компактный вид', columns: columns.slice(0, 1) },
  ]"
/>

Основные props ​

PropТипПо умолчаниюОписание
columnsTableColumn[]обязательныйКонфигурация колонок
dataSourceRecord[][]Строки таблицы
paginationfalse | TablePaginationConfig20 строк, снизу слеваНастройки пагинации; position задаёт размещение сверху и/или снизу, false отключает пагинацию
selectablebooleantrueВыбор строк
selectedObjectsTableRecord[][]Выбранные записи; поддерживает v-model:selected-objects
resizableColumnsbooleantrueИзменение ширины
minColumnWidthnumber70Минимальная ширина
viewStorageKeystring—Сохранение порядка, видимости и ширины
show-view-selectbooleanfalseВыпадающий список кастомных видов
viewsTableView[]falseПредзаполненные настройки отображения колонок
titlestring | nullnullЗаголовок

Доступны слоты start, selectedObjectsActions, bodyCell, headerCell, emptyText, expandedRowRender и summary. Слот start содержит общие инструменты над таблицей, а selectedObjectsActions — действия над выбранными объектами (без параметров слота).

События ​

СобытиеАргументыОписание
columnClickkey: KeyВызывается при нажатии на заголовок столбца. Передаёт key, dataIndex или индекс столбца
columnResizecolumn: TableColumn, width: number, index: numberВызывается после завершения изменения ширины. Передаёт столбец, его новую ширину и индекс среди видимых столбцов
update:columnscolumns: TableColumn[]Передаёт обновлённую конфигурацию столбцов после изменения ширины, сохранения или сброса вида. Поддерживает v-model:columns
update:selectedObjectsobjects: TableRecord[]Передаёт выбранные строки после изменения выбора. Поддерживает v-model:selected-objects

Вложенные строки ​

Для древовидной таблицы добавьте массив children к родительской записи. Плоские наборы данных продолжают работать без изменений. Настройки раскрытия передаются через expandable.

vue
<script setup lang="ts">
const rows = [
  {
    id: 'development',
    name: 'Разработка',
    children: [
      { id: 'frontend', name: 'Frontend' },
      {
        id: 'backend',
        name: 'Backend',
        children: [{ id: 'employee-1', name: 'Анна Смирнова' }],
      },
    ],
  },
]
</script>

<template>
  <Table
    :columns="columns"
    :data-source="rows"
    :expandable="{ defaultExpandAllRows: true, indentSize: 20 }"
    :pagination="false"
    row-key="id"
  />
</template>

Если данные используют другое поле, например nodes, укажите children-column-name="nodes". Значение по умолчанию — children.