В библиотеке Vuetify сортировка данных в таблицах
реализуется через компонент v-data-table,
который предоставляет встроенные механизмы для управления порядком
отображения строк. Основным свойством, отвечающим за сортировку,
является sort-by, а порядок сортировки задаётся через
sort-desc или динамически через события.
Компонент v-data-table поддерживает два
основных подхода:
sort-by:<v-data-table
:headers="headers"
:items="items"
sort-by="name"
:sort-desc="false"
>
</v-data-table>
sort-by — ключ столбца, по которому происходит
сортировка.sort-desc — логическое значение, определяющее
направление: false — по возрастанию, true — по
убыванию.sort-by и
sort-desc, пользователь сможет сортировать таблицу, кликая
по заголовкам столбцов. Для указания возможности сортировки в заголовках
используется свойство sortable в объекте заголовка:headers: [
{ text: 'Имя', value: 'name', sortable: true },
{ text: 'Возраст', value: 'age', sortable: true },
{ text: 'Город', value: 'city', sortable: false }
]
sortable: true — делает столбец кликабельным для
сортировки.sortable: false — отключает сортировку для данного
столбца.Vuetify позволяет сортировать данные одновременно по нескольким
столбцам. Для этого sort-by и sort-desc
принимают массивы:
<v-data-table
:headers="headers"
:items="items"
:sort-by="['city', 'age']"
:sort-desc="[false, true]"
></v-data-table>
sort-by задаёт основной
критерий.sort-desc соответствуют каждому столбцу по
индексу.Иногда требуется нестандартная сортировка, например, по датам в
специфичном формате или по числовым строкам. Для этого используется слот
custom-sort или функция
customSort в объекте таблицы:
methods: {
customSort(items, sortBy, sortDesc) {
return items.sort((a, b) => {
let valA = a[sortBy];
let valB = b[sortBy];
// Преобразование даты
if (sortBy === 'date') {
valA = new Date(valA);
valB = new Date(valB);
}
if (valA < valB) return sortDesc ? 1 : -1;
if (valA > valB) return sortDesc ? -1 : 1;
return 0;
});
}
}
Использование customSort:
<v-data-table
:headers="headers"
:items="items"
:custom-sort="customSort"
></v-data-table>
Компонент v-data-table генерирует
событие update:options при изменении
порядка сортировки пользователем. Его можно использовать для реактивного
обновления состояния:
<v-data-table
:headers="headers"
:items="items"
:options.sync="tableOptions"
></v-data-table>
data() {
return {
tableOptions: {
sortBy: ['name'],
sortDesc: [false],
page: 1,
itemsPerPage: 10
}
}
}
Свойство options.sync позволяет отслеживать изменения
сортировки и сохранять их в родительском компоненте для дальнейшей
обработки или запроса данных с сервера.
Для больших массивов данных часто требуется сортировка на сервере.
Vuetify поддерживает это через реактивное отслеживание параметров
sortBy и sortDesc:
<v-data-table
:headers="headers"
:items="items"
:server-items-length="totalItems"
:options.sync="tableOptions"
:loading="loading"
></v-data-table>
При изменении tableOptions.sortBy или
tableOptions.sortDesc отправляется запрос на сервер с
параметрами:
watch: {
tableOptions: {
handler(newOptions) {
this.fetchData(newOptions.sortBy, newOptions.sortDesc);
},
deep: true
}
}
Такой подход позволяет реализовать эффективную сортировку больших таблиц, избегая загрузки всех данных в клиентскую часть.
Vuetify автоматически отображает стрелки на заголовках сортируемых
столбцов. Дополнительно можно кастомизировать визуализацию через слоты
column.header и top для добавления своих
иконок или текстовых подсказок:
<template v-slot:header.name="{ header, props }">
<th v-bind="props">
{{ header.text }}
<v-icon v-if="props.options.sortBy[0] === 'name'">
{{ props.options.sortDesc[0] ? 'mdi-arrow-down' : 'mdi-arrow-up' }}
</v-icon>
</th>
</template>
props.options.sortBy содержит текущий сортируемый
столбец.props.options.sortDesc указывает направление
сортировки.В результате объединения всех вышеописанных механизмов можно создать
таблицу с многоуровневой, кастомной и серверной
сортировкой, полностью управляемую как со стороны пользователя,
так и программно. Ключевые элементы: headers,
items, sort-by, sort-desc,
custom-sort, options.sync, события
update:options, слоты для кастомной визуализации. Такой
подход делает v-data-table максимально
гибким и пригодным для любых сценариев работы с данными.