Компонент Pagination в Naive UI предназначен для управления навигацией по страницам данных. Он реализует функционал стандартной пагинации, предоставляя гибкие возможности кастомизации, включая настройку количества отображаемых страниц, размеров кнопок, локализации и событий, связанных с изменением текущей страницы.
import { createApp } from 'vue'
import { NPagination } from 'naive-ui'
const app = createApp({
data() {
return {
currentPage: 1,
pageSize: 10,
totalItems: 100
}
},
template: `
<n-pagination
:page="currentPage"
:page-size="pageSize"
:page-count="Math.ceil(totalItems / pageSize)"
@update:page="currentPage = $event"
/>
`
})
app.mount('#app')
В данном примере currentPage отслеживает активную страницу, pageSize задаёт количество элементов на страницу, а page-count вычисляется динамически.
v-model или событие
update:page.Math.ceil(total / pageSize).Pagination поддерживает несколько ключевых событий:
Пример использования событий:
<n-pagination
v-model:page="currentPage"
:page-size="pageSize"
:page-count="pageCount"
@update:page-size="pageSize = $event"
@change="handlePageChange"
/>
methods: {
handlePageChange(page) {
console.log('Текущая страница:', page)
this.loadData(page, this.pageSize)
}
}
Компонент предоставляет возможность полностью управлять визуальной частью кнопок:
<n-pagination
:page="currentPage"
:page-count="pageCount"
:item-render="renderPageItem"
/>
methods: {
renderPageItem({ type, page, active }) {
if (type === 'page') return `Страница ${page}`
return type
}
}
Pagination чаще всего используется вместе с таблицами или списками данных. Основной принцип — изменение currentPage инициирует обновление данных.
Пример с таблицей:
<template>
<n-data-table
:columns="columns"
:data="pagedData"
/>
<n-pagination
v-model:page="currentPage"
:page-size="pageSize"
:page-count="Math.ceil(totalItems / pageSize)"
/>
</template>
<script>
export default {
data() {
return {
currentPage: 1,
pageSize: 10,
totalItems: 100,
fullData: [...], // полный массив данных
}
},
computed: {
pagedData() {
const start = (this.currentPage - 1) * this.pageSize
return this.fullData.slice(start, start + this.pageSize)
}
}
}
</script>
Вычисляемое свойство pagedData автоматически обновляется при смене страницы, обеспечивая синхронизацию таблицы с компонентом пагинации.
Naive UI позволяет настраивать локализацию через locale. Можно изменить подписи кнопок, текста и placeholders:
<n-pagination
:page="currentPage"
:page-count="pageCount"
locale={{
prev: 'Назад',
next: 'Вперед',
total: 'Всего',
page: 'Страница'
}}
/>
Стили компонента настраиваются через стандартные CSS-переменные Naive UI, позволяя изменять цвета, размеры и отступы без изменения исходного кода компонента.
При работе с большими массивами данных рекомендуется использовать remote pagination. Вместо загрузки всего массива сразу, компонент только отправляет номер страницы на сервер, получая ограниченный набор данных. Это снижает нагрузку на клиент и ускоряет рендер.
async function loadPageData(page, pageSize) {
const response = await fetch(`/api/data?page=${page}&size=${pageSize}`)
const result = await response.json()
this.pagedData = result.items
this.totalItems = result.total
}
Комбинация реактивного currentPage и асинхронной функции загрузки обеспечивает плавную работу с тысячами записей.
small, medium, large.Пример компактной пагинации:
<n-pagination
v-model:page="currentPage"
:page-count="pageCount"
size="small"
:show-prev-next-btn="false"
/>
Компонент Pagination в Naive UI сочетает простоту использования и гибкость настройки, что делает его идеальным инструментом для реализации навигации в любых интерфейсах на Vue.js.