В библиотеке Naive UI компонент таблицы
(n-data-table) предоставляет возможность создавать
разворачиваемые строки, которые позволяют отображать
дополнительную информацию о записи без перегрузки основной таблицы.
Основной принцип заключается в том, что каждая строка может иметь
вложенный контент, который отображается по клику на
специальный элемент управления или по заданным условиям.
import { createApp, h } from 'vue'
import { NDataTable } from 'naive-ui'
const columns = [
{
title: 'Имя',
key: 'name'
},
{
title: 'Возраст',
key: 'age'
},
{
title: 'Профессия',
key: 'job'
}
]
const data = [
{ key: 1, name: 'Иван', age: 28, job: 'Инженер', details: 'Дополнительная информация об Иване' },
{ key: 2, name: 'Мария', age: 34, job: 'Дизайнер', details: 'Дополнительная информация о Марии' }
]
createApp({
setup() {
const renderExpandedRow = (row) => {
return h('div', { style: { padding: '12px', color: '#555' } }, row.details)
}
return () => h(NDataTable, {
columns,
data,
rowExpandable: (row) => !!row.details,
renderExpandedRow
})
}
}).mount('#app')
true или
false.Для удобства восприятия и визуального разделения разворачиваемых
строк можно использовать кастомные стили или встроенные
компоненты Naive UI. Например, обернуть содержимое в n-card
или добавить отступы и фоновый цвет:
const renderExpandedRow = (row) => {
return h('div', { style: { padding: '16px', backgroundColor: '#f9f9f9', borderRadius: '4px' } }, [
h('strong', {}, 'Детали: '),
h('span', {}, row.details)
])
}
Иногда требуется открывать или закрывать строки динамически,
например, при изменении состояния других компонентов. Для этого
используется свойство v-model:expandedRowKeys:
import { ref } from 'vue'
const expandedKeys = ref([1]) // строка с key=1 изначально развернута
<NDataTable
columns={columns}
data={data}
rowExpandable={(row) => !!row.details}
renderExpandedRow={renderExpandedRow}
v-model:expandedRowKeys={expandedKeys}
/>
Методы манипуляции массивом expandedKeys позволяют
разворачивать/сворачивать строки:
// Развернуть все строки
expandedKeys.value = data.filter(row => row.details).map(row => row.key)
// Свернуть все строки
expandedKeys.value = []
Naive UI предоставляет события, которые помогают отслеживать действия пользователя:
Пример использования:
<NDataTable
columns={columns}
data={data}
rowExpandable={(row) => !!row.details}
renderExpandedRow={renderExpandedRow}
onExp and={(row) => console.log('Раскрыта строка:', row)}
onColla pse={(row) => console.log('Свернута строка:', row)}
/>
Разворачиваемые строки могут содержать другие таблицы, списки, формы или любые Vue-компоненты. Это особенно полезно для отображения связанных данных, например, заказов пользователя или истории изменений:
const renderExpandedRow = (row) => {
return h(NDataTable, {
columns: [{ title: 'Дата', key: 'date' }, { title: 'Сумма', key: 'amount' }],
data: row.orders || []
})
}
rowExpandable, чтобы не создавать
разворачиваемое содержимое для всех строк сразу.renderExpandedRow. Лучше подготовить данные заранее.Разворачиваемые строки в Naive UI обеспечивают гибкость, позволяя добавлять дополнительные уровни информации без перегрузки интерфейса. Они полностью управляемы через свойства и события, поддерживают динамическое управление и позволяют использовать любые Vue-компоненты для отображения детализированных данных.