Серверная пагинация позволяет обрабатывать большие массивы данных,
загружая в таблицу только ограниченное количество записей за один
запрос. Это критично для производительности, когда клиентская загрузка
всех данных невозможна или неэффективна. В Vuetify серверная пагинация
реализуется через компонент v-data-table с
использованием событий update:options или
options, а также реактивного состояния для
хранения текущих параметров запроса к серверу.
Для реализации серверной пагинации необходимо передать таблице следующие ключевые свойства:
:items="items" — массив данных,
получаемых с сервера.:server-items-length="totalItems" —
общее количество записей на сервере.:options.sync="options" — реактивный
объект с текущими параметрами пагинации и сортировки.loading — флаг для отображения
индикатора загрузки.Пример базовой конфигурации:
data() {
return {
items: [],
totalItems: 0,
options: {
page: 1,
itemsPerPage: 10,
sortBy: [],
sortDesc: [],
groupBy: [],
groupDesc: [],
multiSort: false,
mustSort: false
},
loading: false
};
},
watch: {
options: {
handler() {
this.fetchData();
},
deep: true
}
},
methods: {
async fetchData() {
this.loading = true;
const { page, itemsPerPage, sortBy, sortDesc } = this.options;
const params = {
_page: page,
_limit: itemsPerPage,
_sort: sortBy.join(','),
_order: sortDesc.map(desc => (desc ? 'desc' : 'asc')).join(',')
};
try {
const response = await axios.get('/api/items', { params });
this.items = response.data.items;
this.totalItems = response.data.total;
} finally {
this.loading = false;
}
}
}
optionsОбъект options формирует логику пагинации, сортировки и
группировки данных на сервере:
page — текущая страница.itemsPerPage — количество элементов на
странице.sortBy — массив полей для
сортировки.sortDesc — массив булевых значений для
направления сортировки (true — по убыванию).groupBy и
groupDesc — группировка данных, также
передается на сервер при необходимости.Использование этих параметров позволяет серверу возвращать только необходимые записи, снижая нагрузку на клиент и ускоряя отображение таблицы.
Для корректной работы с серверной пагинацией важно учитывать асинхронность:
loading должен быть активен на
время запроса, чтобы компонент показывал индикатор загрузки.try/catch и отображаться пользователю или
логироваться.items и
totalItems должно происходить только после
успешного ответа сервера.Сортировка и фильтрация больших массивов данных должна выполняться на
сервере, чтобы минимизировать объем передаваемых данных. Vuetify
автоматически передает параметры сортировки через
options.sortBy и options.sortDesc. Фильтрацию
можно реализовать аналогично, добавив в объект options поле
search и передавая его серверу.
Пример передачи параметров поиска:
watch: {
'options.search'(val) {
this.fetchData();
}
}
На сервере нужно использовать эти параметры для фильтрации массива данных перед отправкой клиенту.
v-data-table с серверной пагинацией<v-data-table
:headers="headers"
:items="items"
:server-items-length="totalItems"
:options.sync="options"
:loading="loading"
item-key="id"
>
<template v-slot:no-data>
Нет данных для отображения
</template>
</v-data-table>
data() {
return {
headers: [
{ text: 'ID', value: 'id' },
{ text: 'Имя', value: 'name' },
{ text: 'Email', value: 'email' }
],
items: [],
totalItems: 0,
options: { page: 1, itemsPerPage: 10, sortBy: [], sortDesc: [] },
loading: false
};
},
watch: {
options: {
handler() {
this.fetchData();
},
deep: true
}
},
methods: {
async fetchData() {
this.loading = true;
const { page, itemsPerPage, sortBy, sortDesc } = this.options;
const params = { page, per_page: itemsPerPage, sortBy, sortDesc };
try {
const response = await axios.get('/api/users', { params });
this.items = response.data.items;
this.totalItems = response.data.total;
} finally {
this.loading = false;
}
}
}
Серверная пагинация в Vuetify позволяет эффективно работать с
большими данными, управляя загрузкой и отображением таблиц. Ключевой
механизм — реактивный объект options, который
синхронизируется с сервером, обеспечивая актуальные данные и управление
сортировкой, фильтрацией и постраничной навигацией. Асинхронная
загрузка, правильная обработка ошибок и оптимизация запросов позволяют
создавать высокопроизводительные и масштабируемые интерфейсы.