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
npm i v-page
sh
yarn add v-page
yarn add v-page
sh
pnpm add v-page
pnpm add v-page

全局安装插件

js
// add component in global scope as plugin
import { createApp } from 'vue'
import App from './app.vue'
import { PaginationBar } from 'v-page'

const app = createApp(App)
app.use(PaginationBar, {
  // globally config options
})
app.mount('#app')
// add component in global scope as plugin
import { createApp } from 'vue'
import App from './app.vue'
import { PaginationBar } from 'v-page'

const app = createApp(App)
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>
<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
    v-model="pageNumber"
    :total-row="totalRow"
    @change="change"
  />
</template>

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

const pageNumber = ref(3)
const totalRow = ref(100)
const list = ref([])
// respond for pagination change
function change (data) {
  console.log(data) // { pageNumber: 1, pageSize: 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>
  <div
    v-for="item in list"
    :key="item.key"
    v-text="item.name"
  />

  <PaginationBar
    v-model="pageNumber"
    :total-row="totalRow"
    @change="change"
  />
</template>

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

const pageNumber = ref(3)
const totalRow = ref(100)
const list = ref([])
// respond for pagination change
function change (data) {
  console.log(data) // { pageNumber: 1, pageSize: 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>

实例

快速应用

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

分页事件 change 响应数据

画廊数据展示模式实例

vue
<template>
  <div>
    <div
      v-for="item in listGallery"
      :key="item"
      v-text=item
    />
  </div>
  <PaginationBar
    align="left"
    language="cn"
    :total-row="88"
    @change="changeGallery"
  />
</template>

<script setup>
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
  })
}
</script>
<template>
  <div>
    <div
      v-for="item in listGallery"
      :key="item"
      v-text=item
    />
  </div>
  <PaginationBar
    align="left"
    language="cn"
    :total-row="88"
    @change="changeGallery"
  />
</template>

<script setup>
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
  })
}
</script>

分页操作

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

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

  <PaginationBar v-model="pageNumberOperate" />
</template>

<script setup>
import { ref } from 'vue'

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

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

  const newPageNumber = Number(inputPageNumber.value)

  if (window.isNaN(newPageNumber)) {
    inputPageNumber.value = ''
    return
  }
  pageNumberOperate.value = newPageNumber
}
</script>
<template>
  <div>
    <input type="text" v-model="inputPageNumber" />
    <button type="button" @click="goToInputPage" >go</button>
    <button type="button" @click="pageNumberOperate++" >pageNumber + 1</button>
  </div>

  <PaginationBar v-model="pageNumberOperate" />
</template>

<script setup>
import { ref } from 'vue'

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

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

  const newPageNumber = Number(inputPageNumber.value)

  if (window.isNaN(newPageNumber)) {
    inputPageNumber.value = ''
    return
  }
  pageNumberOperate.value = newPageNumber
}
</script>

对齐方向

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

显示边框模式

vue
<PaginationBar :border="true" />
<PaginationBar :border="true" />

启用与禁用

vue
<PaginationBar :disabled="true" />
<PaginationBar :disabled="true" />

功能模块的启用与关闭

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

插槽

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

vue
<template>
  <PaginationBar
    border
    align="left"
    :total-row="28"
    :page-size-menu="false"
    :info="false"
    :first="false"
    :last="false"
    v-slot="{ 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>
  </PaginationBar>
</template>
<template>
  <PaginationBar
    border
    align="left"
    :total-row="28"
    :page-size-menu="false"
    :info="false"
    :first="false"
    :last="false"
    v-slot="{ 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>
  </PaginationBar>
</template>

显示全部数据选项

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

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

Props

v-model/value

  • 类型 number

设置默认页/当前页

total-row

  • 类型 number

每次数据查询中的总记录数,在父组件进行数据查询后,必须更新插件的总记录数参数

language

  • 类型 string
  • 默认 'en'

指定分页栏语言,完整语言清单

  • 'cn' 简体中文
  • 'en' English
  • 'de' German
  • 'pt' Portuguese
  • 'jp' Japanese

page-size-menu

  • 类型 number[] | boolean
  • 默认 [10, 20, 50, 100]

分页尺寸列表, 可设置 false 来关闭该栏

align

  • 类型 'left' | 'center' | 'right'
  • 默认 'right'

分页栏对齐方向

disabled

  • 类型 boolean
  • 默认 false

启用/禁用 分页栏

info

  • 类型 boolean
  • 默认 true

显示分页信息栏

border

  • 类型 boolean
  • 默认 false

显示边框模式

page-number

  • 类型 boolean
  • 默认 true

显示分页码模块

first

  • 类型 boolean
  • 默认 true

显示首页按钮

last

  • 类型 boolean
  • 默认 true

显示尾页按钮

display-all

  • 类型 boolean
  • 默认 false

在每页记录数列表中增加显示所有数据记录项目

事件

组件各类操作的响应事件

change

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

ts
change: (data: PageInfo) => void
change: (data: PageInfo) => void
ts
interface PageInfo {
  // 当前分页号
  pageNumber: number
  // 每页显示记录数
  pageSize: number
}
// 也可以通过以下的方式直接使用类型
import type { PageInfo } from 'v-page/types'
interface PageInfo {
  // 当前分页号
  pageNumber: number
  // 每页显示记录数
  pageSize: number
}
// 也可以通过以下的方式直接使用类型
import type { PageInfo } from 'v-page/types'

API

使用插件的 API 前,需为组件声明 ref 属性,并使用 ref() 声明对应名称的响应式变量以调用 API 方法

vue
<template>
  <PaginationBar ref="page" />
</template>

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

const page = ref(null)
// call api
page.value.goPage(3)
</script>
<template>
  <PaginationBar ref="page" />
</template>

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

const page = ref(null)
// call api
page.value.goPage(3)
</script>

goPage

切换当前页

ts
goPage: (page: number) => void
goPage: (page: number) => void

reload

更新分页信息及事件

ts
reload: () => void
reload: () => void

Released under the MIT License.