Tree Table — это компонент для отображения иерархических данных в
виде таблицы с возможностью разворачивания и сворачивания узлов. В Naive
UI этот компонент реализован через
n-tree-table, который сочетает
функциональность обычной таблицы с поддержкой древовидной структуры.
Ключевые свойства компонента:
columns — массив объектов, описывающих колонки таблицы.
Каждая колонка может иметь поля: title, key,
render, width, sortable,
align.data — массив объектов, представляющих строки. Каждый
объект может содержать поле children для вложенных
элементов.row-key — уникальный ключ строки, обязательный для
корректной работы развертывания и идентификации узлов.expandable — функция или булево значение, определяющее,
может ли строка быть развернута.default-expanded-keys — массив ключей строк, которые
должны быть развернуты при инициализации.Пример минимальной конфигурации Tree Table:
import { createApp, h } from 'vue'
import { NTreeTable } from 'naive-ui'
const columns = [
{ title: 'Имя', key: 'name', width: 200 },
{ title: 'Возраст', key: 'age', width: 100 },
{ title: 'Должность', key: 'position', width: 150 }
]
const data = [
{ key: 1, name: 'Иван', age: 30, position: 'Разработчик', children: [
{ key: 2, name: 'Мария', age: 25, position: 'Младший разработчик' }
]}
]
createApp({
render: () => h(NTreeTable, {
columns,
data,
rowKey: 'key',
defaultExpandedKeys: [1]
})
}).mount('#app')
Для Tree Table можно использовать слот
render, позволяющий создавать кастомный контент
для ячеек. Это особенно полезно, если требуется форматирование текста,
добавление иконок или кнопок:
const columns = [
{
title: 'Имя',
key: 'name',
render(row) {
return h('span', { style: { color: 'blue' } }, row.name)
}
}
]
Колонки поддерживают сортировку (sortable) и
выравнивание (align: 'left' | 'center' | 'right'). Для
динамического форматирования можно использовать вычисляемые свойства в
render.
Разворачивание и сворачивание осуществляется через
expanded-keys и события:
on-update:expanded-keys — вызывается при изменении
состояния узлов.expandable — функция, которая определяет, можно ли
развернуть конкретный узел. Например:expandable: row => !!row.children && row.children.length > 0
Программное управление состоянием позволяет создавать Tree Table с полностью контролируемым поведением, включая динамическую подгрузку данных при раскрытии узла.
Для работы с большими наборами данных Tree Table поддерживает
виртуализацию строк через свойство
virtual-scroll. Это снижает нагрузку на рендеринг и
улучшает производительность:
<NTreeTable
:columns="columns"
:data="data"
row-key="key"
:virtual-scroll="{ itemHeight: 40 }"
/>
Naive UI позволяет подгружать дочерние элементы по требованию, что полезно при работе с API:
async function loadChildren(row) {
const children = await fetch(`/api/children?parentId=${row.id}`).then(r => r.json())
row.children = children
}
Можно комбинировать с событием on-update:expanded-keys,
чтобы подгружать данные только при первом раскрытии узла.
Tree Table наследует тему Naive UI, поэтому можно использовать глобальные настройки цветов, шрифтов и размеров:
import { createTheme } from 'naive-ui'
const themeOverrides = {
common: {
primaryColor: '#4caf50'
},
Table: {
thColor: '#f0f0f0',
tdColor: '#ffffff'
}
}
Кроме глобальной темы, возможна локальная стилизация
отдельных ячеек через render или
class в колонках.
Tree Table поддерживает множество событий для реализации интерактивности:
on-row-click — клик по строке.on-row-dblclick — двойной клик.on-expand — раскрытие узла.on-collapse — сворачивание узла.on-selection-change — изменение выбранных строк (при
использовании селекторов).С помощью этих событий можно создавать полноценные интерфейсы управления данными с поддержкой фильтрации, редактирования и перемещения строк.
children.expanded-keys и
expandable.render.Tree Table в Naive UI сочетает гибкость обычной таблицы с удобством работы с древовидными структурами, что делает его универсальным инструментом для построения интерфейсов с вложенными данными.