Pagination 分页

当数据量过多时,使用分页分解数据。

基础用法

设置layout,表示需要显示的内容,用逗号分隔,布局元素会依次显示。 prev表示上一页,next为下一页,pager表示页码列表,除此以外还提供了jumpertotalsize和特殊的布局符号->->后的元素会靠右显示,jumper表示跳页元素,total表示总条目数,size用于设置每页显示的页码数量。

Pagination 分页 - 图1

  1. <template>
  2. <div class="example-pagination-block">
  3. <div class="example-demonstration">When you have few pages</div>
  4. <el-pagination layout="prev, pager, next" :total="50" />
  5. </div>
  6. <div class="example-pagination-block">
  7. <div class="example-demonstration">When you have more than 7 pages</div>
  8. <el-pagination layout="prev, pager, next" :total="1000" />
  9. </div>
  10. </template>
  11. <style scoped>
  12. .example-pagination-block + .example-pagination-block {
  13. margin-top: 10px;
  14. }
  15. .example-pagination-block .example-demonstration {
  16. margin-bottom: 16px;
  17. }
  18. </style>

设置最大页码按钮数

默认情况下,当总页数超过 7 页时,Pagination 会折叠多余的页码按钮。 通过 pager-count 属性可以设置最大页码按钮数。

Pagination 分页 - 图2

  1. <template>
  2. <el-pagination
  3. :page-size="20"
  4. :pager-count="11"
  5. layout="prev, pager, next"
  6. :total="1000"
  7. />
  8. </template>

带有背景色的分页

设置background属性可以为分页按钮添加背景色。

Pagination 分页 - 图3

  1. <template>
  2. <el-pagination background layout="prev, pager, next" :total="1000" />
  3. </template>

小型分页

在空间有限的情况下,可以使用简单的小型分页。

只需要设置 small 属性为 true 即可让分页变小。

Pagination 分页 - 图4

  1. <template>
  2. <el-pagination small layout="prev, pager, next" :total="50" />
  3. <el-pagination
  4. small
  5. background
  6. layout="prev, pager, next"
  7. :total="50"
  8. class="mt-4"
  9. />
  10. </template>

当只有一页时隐藏分页

当只有一页时,通过设置 hide-on-single-page 属性来隐藏分页。

Pagination 分页 - 图5

  1. <template>
  2. <div>
  3. <el-switch v-model="value" />
  4. <hr class="my-4" />
  5. <el-pagination
  6. :hide-on-single-page="value"
  7. :total="5"
  8. layout="prev, pager, next"
  9. />
  10. </div>
  11. </template>
  12. <script lang="ts" setup>
  13. import { ref } from 'vue'
  14. const value = ref(false)
  15. </script>

附加功能

根据场景需要,可以添加其他功能模块。

此示例是一个完整的用例。 使用了 size-changecurrent-change 事件来处理页码大小和当前页变动时候触发的事件。 page-sizes接受一个整数类型的数组,数组元素为展示的选择每页显示个数的选项,[100, 200, 300, 400] 表示四个选项,每页显示 100 个,200 个,300 个或者 400 个。

Pagination 分页 - 图6

  1. <template>
  2. <div class="flex items-center mb-4">
  3. <el-radio-group v-model="small" class="mr-4">
  4. <el-radio-button :label="false">default</el-radio-button>
  5. <el-radio-button :label="true">small</el-radio-button>
  6. </el-radio-group>
  7. <div>
  8. background:
  9. <el-switch v-model="background" class="ml-2" />
  10. </div>
  11. <div class="ml-4">
  12. disabled: <el-switch v-model="disabled" class="ml-2" />
  13. </div>
  14. </div>
  15. <hr class="my-4" />
  16. <div class="demo-pagination-block">
  17. <div class="demonstration">Total item count</div>
  18. <el-pagination
  19. v-model:currentPage="currentPage1"
  20. :page-size="100"
  21. :small="small"
  22. :disabled="disabled"
  23. :background="background"
  24. layout="total, prev, pager, next"
  25. :total="1000"
  26. @size-change="handleSizeChange"
  27. @current-change="handleCurrentChange"
  28. />
  29. </div>
  30. <div class="demo-pagination-block">
  31. <div class="demonstration">Change page size</div>
  32. <el-pagination
  33. v-model:currentPage="currentPage2"
  34. v-model:page-size="pageSize2"
  35. :page-sizes="[100, 200, 300, 400]"
  36. :small="small"
  37. :disabled="disabled"
  38. :background="background"
  39. layout="sizes, prev, pager, next"
  40. :total="1000"
  41. @size-change="handleSizeChange"
  42. @current-change="handleCurrentChange"
  43. />
  44. </div>
  45. <div class="demo-pagination-block">
  46. <div class="demonstration">Jump to</div>
  47. <el-pagination
  48. v-model:currentPage="currentPage3"
  49. v-model:page-size="pageSize3"
  50. :small="small"
  51. :disabled="disabled"
  52. :background="background"
  53. layout="prev, pager, next, jumper"
  54. :total="1000"
  55. @size-change="handleSizeChange"
  56. @current-change="handleCurrentChange"
  57. />
  58. </div>
  59. <div class="demo-pagination-block">
  60. <div class="demonstration">All combined</div>
  61. <el-pagination
  62. v-model:currentPage="currentPage4"
  63. v-model:page-size="pageSize4"
  64. :page-sizes="[100, 200, 300, 400]"
  65. :small="small"
  66. :disabled="disabled"
  67. :background="background"
  68. layout="total, sizes, prev, pager, next, jumper"
  69. :total="400"
  70. @size-change="handleSizeChange"
  71. @current-change="handleCurrentChange"
  72. />
  73. </div>
  74. </template>
  75. <script lang="ts" setup>
  76. import { ref } from 'vue'
  77. const currentPage1 = ref(5)
  78. const currentPage2 = ref(5)
  79. const currentPage3 = ref(5)
  80. const currentPage4 = ref(4)
  81. const pageSize2 = ref(100)
  82. const pageSize3 = ref(100)
  83. const pageSize4 = ref(100)
  84. const small = ref(false)
  85. const background = ref(false)
  86. const disabled = ref(false)
  87. const handleSizeChange = (val: number) => {
  88. console.log(`${val} items per page`)
  89. }
  90. const handleCurrentChange = (val: number) => {
  91. console.log(`current page: ${val}`)
  92. }
  93. </script>
  94. <style scoped>
  95. .demo-pagination-block + .demo-pagination-block {
  96. margin-top: 10px;
  97. }
  98. .demo-pagination-block .demonstration {
  99. margin-bottom: 16px;
  100. }
  101. </style>

属性

属性说明类型可选值默认值
small是否使用小型分页样式booleanfalse
background是否为分页按钮添加背景色booleanfalse
page-size每页显示条目个数,支持 v-model 双向绑定number10
default-page-size每页显示条目数的初始值number--
total总条目数number
page-count总页数, totalpage-count 设置任意一个就可以达到显示页码的功能;如果要支持 page-sizes 的更改,则需要使用 total 属性number
pager-count设置最大页码按钮数。 页码按钮的数量,当总页数超过该值时会折叠number5 ≤ x ≤ 21 的奇数7
current-page当前页数,支持 v-model 双向绑定number1
default-current-page当前页数的初始值number--
layout组件布局,子组件名用逗号分隔stringsizes / prev / pager / next / jumper / -> / total / slot‘prev, pager, next, jumper, ->, total’
page-sizes每页显示个数选择器的选项设置number[][10, 20, 30, 40, 50, 100]
popper-class每页显示个数选择器的下拉框类名string
prev-text替代图标显示的上一页文字string
prev-icon上一页的图标, 比 prev-text 优先级更高string | ComponentArrowLeft
next-text替代图标显示的下一页文字string
next-icon下一页的图标, 比 next-text 优先级更高string | ComponentArrowRight
disabled是否禁用分页booleanfalse
hide-on-single-page只有一页时是否隐藏boolean-

WARNING

我们现在会检查一些不合理的用法,如果发现分页器未显示,可以核对是否违反以下情形:

  • totalpage-count 必须传一个,不然组件无法判断总页数;优先使用 page-count;
  • 如果传入了 current-page,必须监听 current-page 变更的事件(@update:current-page),否则分页切换不起作用;
  • 如果传入了 page-size,且布局包含 page-size 选择器(即 layout 包含 sizes),必须监听 page-size 变更的事件(@update:page-size),否则分页大小的变化将不起作用。

事件

事件名说明参数
size-changepage-size 改变时触发新每页条数
current-changecurrent-page 改变时触发新当前页
prev-click用户点击上一页按钮改变当前页时触发新当前页
next-click用户点击下一页按钮改变当前页时触发新当前页

WARNING

以上事件不推荐使用(但由于兼容的原因仍然支持,在以后的版本中将会被删除);如果要监听 current-page 和 page-size 的改变,使用 v-model 双向绑定是个更好的选择。

插槽

名称说明
自定义内容 设置文案,需要在 layout 中列出 slot

源代码

组件 Pagination 分页 - 图7 文档 Pagination 分页 - 图8

贡献者

Pagination 分页 - 图9 三咲智子

Pagination 分页 - 图10 云游君

Pagination 分页 - 图11 Anas Boudih

Pagination 分页 - 图12 jeremywu

Pagination 分页 - 图13 류한경

Pagination 分页 - 图14 msidolphin

Pagination 分页 - 图15 Aex

Pagination 分页 - 图16 zz

Pagination 分页 - 图17 LIUCHAO

Pagination 分页 - 图18 btea

Pagination 分页 - 图19 ioslh

Pagination 分页 - 图20 qiang

Pagination 分页 - 图21 handsomeFu

Pagination 分页 - 图22 Delyan Haralanov

Pagination 分页 - 图23 blackie

Pagination 分页 - 图24 bqy

Pagination 分页 - 图25 renovate[bot]

Pagination 分页 - 图26 Zhongxiang Wang

Pagination 分页 - 图27 Xc

Pagination 分页 - 图28 gjfei

Pagination 分页 - 图29 Twiliness

Pagination 分页 - 图30 Alan Wang

Pagination 分页 - 图31 Summer

Pagination 分页 - 图32 on the field of hope

Pagination 分页 - 图33 Hades-li

Pagination 分页 - 图34 啝裳

Pagination 分页 - 图35 C.Y.Kun