Skip to content

Pagination

分页栏组件

GitHub Repo stars GitHub forks

项目状态

CircleCI code coverage npm version license JavaScript Style Guide

版本更新内容请访问 Changelog

如果您的项目正在使用 vue 2.x 版本生态,请使用 v-page 2.x 版本

安装

v-page 组件安装到项目中

sh
npm i v-page
sh
yarn add v-page
sh
pnpm add v-page

全局安装插件

js
import { createApp } from 'vue'
import App from './app.vue'
import { PaginationBar } from 'v-page'

const app = createApp(App)
// globally install component
app.use(PaginationBar, {
  // globally config options
})
app.mount('#app')

可在全局安装组件时设置的属性

  • info
  • pageSizeMenu
  • language
  • align
  • border
  • pageNumber
  • first
  • last

当然,您也可以仅在需要使用的地方引用组件,这也是更加推荐的使用方式。这更有利于代码拆分打包,起到更好的按需引用效果

vue
<template>
  <PaginationBar />
</template>

<script setup>
import { PaginationBar } from 'v-page'
</script>

在页面中应用组件

一个分页栏的典型用法

vue
<template>
  <div
    v-for="item in list"
    :key="item.key"
    v-text="item.name"
  />
  <PaginationBar
    language="cn"
    v-model="pageNumber"
    :total-row="totalRow"
    @change="change"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { PaginationBar } from 'v-page'
import type { PageInfo } from 'v-page'

const pageNumber = ref<number>(3)
const totalRow = ref<number>(100)
const list = ref<unknown[]>([])
// respond for pagination change
function change (data: PageInfo): void {
  console.log(data) // { pageNumber: 1, pageSize: 10, totalPage: 10 }

  const params = {
    pageNumber: data.pageNumber,
    pageSize: data.pageSize,
    ...
  }
  // do some http request for example
  axios.post('some-api-address', params).then(resp => {
    // fetch new data and update data list and `totalRow` variable
    list.value = resp.list || []
    totalRow.value = resp.totalRow
  })
}
</script>

实例

快速应用

template
<PaginationBar
  language="cn"
  :total-row="21"
  @change="change"
/>

分页事件 change 响应数据

Event data logs

画廊数据展示模式实例

template
<div>
  <div
    v-for="item in listGallery"
    :key="item"
    v-text=item
  />
</div>
<PaginationBar
  align="center"
  :total-row="88"
  @change="changeGallery"
/>
js
import { ref } from 'vue'
import { PaginationBar } from 'v-page'

const srcList = Array(88).fill(0).map((val, index) => index + 1)
const listGallery = ref([])

function changeGallery ({ pageNumber, pageSize }) {
  const start = pageSize * (pageNumber - 1)
  const end = (start + pageSize) > srcList.length
    ? srcList.length
    : start + pageSize
  listGallery.value = srcList.filter((val, index) => {
    return index >= start && index < end
  })
}

分页操作

几个实例展示分页码的操作方式

template
<div>
  <input type="text" v-model="inputPageNumber" />
  <button type="button" @click="goToInputPage" >go</button>
  <button
    type="button"
    @click="pageNumber++"
  >pageNumber + 1</button>
</div>

<PaginationBar v-model="pageNumber" />
js
import { ref } from 'vue'

const pageNumber = ref(3)
const inputPageNumber = ref('2')

function goToInputPage () {
  if (!inputPageNumber.value) return

  const newPageNumber = Number(inputPageNumber.value)

  if (window.isNaN(newPageNumber)) {
    inputPageNumber.value = ''
    return
  }
  pageNumber.value = newPageNumber
}

每页记录数

pageSize 指定了每页记录数,pageSizeMenu 提供了可供用户快速选择的每页记录数列表

template
<PaginationBar
  v-model:page-size="pageSize"
  :total-row="100"
/>
js
import { ref } from 'vue'

const pageSize = ref(25)

pageSizeMenu 所提供值列表没有与 pageSize 值匹配的项目时,则该值将自动添加进 pageSizeMenu 列表中,并选中该值

对齐方向

template
<PaginationBar align="left" />
指定对齐方向

显示边框模式

template
<PaginationBar border />

圆形按钮风格

template
<PaginationBar circle />

启用与禁用

template
<PaginationBar :disabled="true" />

功能模块的启用与关闭

设置分页栏模块的启用与关闭

插槽

v-page 提供了作用域插槽,输出分页栏核心状态数据,方便进行功能定制

template
<PaginationBar
  border
  align="left"
  :total-row="28"
  :page-size-options="false"
  :info="false"
  :first="false"
  :last="false"
>
  <template #default="{
    pageNumber, pageSize, totalPage,
    totalRow, isFirst, isLast
  }">
    <div>
      <div>page: <span v-text="pageNumber" /></div>
      <div>pageSize: <span v-text="pageSize" /></div>
      <div>totalPage: <span v-text="totalPage" /></div>
      <div>totalRow: <span v-text="totalRow" /></div>
      <div>isFirst: <span v-text="isFirst" /></div>
      <div>isLast: <span v-text="isLast" /></div>
    </div>
  </template>
</PaginationBar>

显示全部数据选项

每页记录数 栏增加显示全部数据的选项,用于设置数据展示栏显示全部数据,不进行分页。选择该项目后,change 事件的响应数据如下

js
{
  pageNumber: 1,
  pageSize: 0,
  totalPage: 1
}

Props

v-page 的设置参数

ts
interface PaginationProps {
  /**
   * 默认页/当前页
   * @default 1
   */
  modelValue?: number
  /**
   * 每页数据记录数
   * @default 10
   */
  pageSize?: number
  /**
   * 总记录数
   */
  totalRow: number
  /**
   * 组件语言
   * @default `en`
   * 
   * 完整语言清单
   * `cn` 简体中文
   * `en` English
   * `de` German
   * `pt` Portuguese
   * `jp` Japanese
   */
  language?: 'cn' | 'en' | 'de' | 'jp' | 'pt'
  /**
   * 每页数据记录数列表,仅在 `pageSizeOptions` 为 `true` 时生效
   * @default [10, 20, 50, 100]
   */
  pageSizeMenu?: number[]
  /**
   * 分页栏对齐方向
   * @default `right`
   */
  align?: 'left' | 'right' | 'center'
  /**
   * 禁用分页栏组件
   * @default false
   */
  disabled?: boolean
  /**
   * 显示边框样式
   * @default true
   */
  border?: boolean
  /**
   * 圆形按钮风格
   * @default false
   */
  circle?: boolean
  /**
   * 显示记录数列表面板
   * @default true
   */
  pageSizeOptions?: boolean
  /**
   * 显示分页信息面板
   * @default true
   */
  info?: boolean
  /**
   * 显示分页码模块
   * @default true
   */
  pageNumber?: boolean
  /**
   * 显示首页按钮
   * @default true
   */
  first?: boolean
  /**
   * 显示尾页按钮
   * @default true
   */
  last?: boolean
  /**
   * 在每页记录数列表中增加显示所有数据记录项目
   * @default false
   */
  displayAll?: boolean
  /**
   * 在只有一页数据时,隐藏分页栏
   * @default false
   */
  hideOnSinglePage?: boolean
}

事件

组件各类操作的响应事件

change

分页栏操作发生数据变更时,触发的响应事件

ts
change: (data: PageInfo) => void
ts
interface PageInfo {
  // 当前分页号
  pageNumber: number
  // 每页显示记录数
  pageSize: number
  // 总页数
  totalPage: number
}
// 可直接使用组件提供类型描述
import type { PageInfo } from 'v-page'

update:modelValue

当前页变更时,触发的响应事件

ts
`update:modelValue`: (value: number) => void

update:pageSize

每页记录数变更时,触发的响应事件

ts
`update:pageSize`: (value: number) => void

Released under the MIT License.