Компонент Table в библиотеке Naive UI предназначен для отображения табличных данных с гибкой конфигурацией колонок, сортировкой, фильтрацией и пагинацией. Он полностью настраиваемый и поддерживает реактивные данные Vue 3, что делает его идеальным инструментом для построения интерфейсов с динамическими таблицами.
import { NTable } from 'naive-ui'
Для базового использования требуется передать массив объектов в проп
data и массив колонок в проп columns.
const columns = [
{ title: 'Имя', key: 'name' },
{ title: 'Возраст', key: 'age' },
{ title: 'Город', key: 'city' }
];
const data = [
{ name: 'Иван', age: 28, city: 'Москва' },
{ name: 'Мария', age: 24, city: 'Санкт-Петербург' }
];
<n-table :columns="columns" :data="data" />
Каждая колонка задается объектом с ключевыми свойствами:
'150px').'left' | 'center' | 'right'.const columns = [
{
title: 'Имя',
key: 'name',
width: '200px',
render(row) {
return `<strong>${row.name}</strong>`;
}
},
{ title: 'Возраст', key: 'age', align: 'center' }
];
Naive UI поддерживает сортировку по колонкам с помощью объекта
sorter в конфигурации колонки:
const columns = [
{ title: 'Имя', key: 'name' },
{ title: 'Возраст', key: 'age', sorter: (a, b) => a.age - b.age }
];
Свойство sorter принимает функцию сравнения,
аналогичную той, что используется в
Array.prototype.sort.
<n-table :columns="columns" :data="data" :remote-sort="false" />
true, таблица не
выполняет сортировку локально, а сигнализирует о необходимости
сортировки на сервере.Фильтрация задается через свойство filters колонки. Оно представляет собой массив объектов:
const columns = [
{
title: 'Город',
key: 'city',
filters: [
{ label: 'Москва', value: 'Москва' },
{ label: 'Санкт-Петербург', value: 'Санкт-Петербург' }
],
filterMethod: (value, row) => row.city === value
}
];
Свойство render позволяет полностью контролировать отображение содержимого. Функция принимает объект с текущей строкой и колонкой:
const columns = [
{
title: 'Возраст',
key: 'age',
render(row) {
return row.age > 25 ? `<span style="color:red">${row.age}</span>` : row.age;
}
}
];
Для Vue-компонентов можно использовать JSX или h:
import { h } from 'vue'
render(row) {
return h('span', { style: { color: row.age > 25 ? 'red' : 'black' } }, row.age)
}
Компонент NTable не включает встроенную пагинацию, но тесно интегрируется с NPagination:
<n-table :columns="columns" :data="paginatedData" />
<n-pagination
v-model:page="currentPage"
:page-count="totalPages"
:page-size="pageSize"
/>
Для реализации пагинации необходимо:
paginatedData, который
содержит только данные текущей страницы.import { computed, ref } from 'vue'
const currentPage = ref(1)
const pageSize = ref(10)
const paginatedData = computed(() => {
const start = (currentPage.value - 1) * pageSize.value
const end = start + pageSize.value
return data.slice(start, end)
})
Naive UI поддерживает слоты для кастомизации заголовков и ячеек:
<n-table :columns="columns" :data="data">
<template #header="{ column }">
<strong>{{ column.title }}</strong>
</template>
<template #default="{ row, column }">
<span v-if="column.key === 'age' && row.age > 30" style="color: red">{{ row.age }}</span>
<span v-else>{{ row[column.key] }}</span>
</template>
</n-table>
'small' | 'medium' | 'large'.<n-table
:columns="columns"
:data="data"
:bordered="true"
size="medium"
:scroll="{ x: 800, y: 400 }"
/>
Комбинирование всех этих свойств позволяет строить сложные таблицы с:
Эта гибкость делает Table Naive UI мощным инструментом для реализации профессиональных интерфейсов с большими объемами данных.