Skip to content

Element Plus分页组件

2023.07.12

问题描述

Element Plus 中的分页组件(el-pagination)在当前页为最后一页,选择较大的每页展示数时,除了触发 size-change 事件,还触发了 current-change 事件。

demo地址:Element Plus Playground

vue
<template>
  <el-pagination 
    :current-page="currentPage"
   	:page-size="pageSize" 
    :total="total" 
    background
    layout="total, prev, pager, next, sizes" 
    @update:current-page="handleChangePage" 
    @update:page-size="handleChangeSize" 
   />
</template>

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

const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(50);

function handleChangePage(val) {
  console.log('当前页数改变了', val);
  currentPage.value = val;
  getList(val, pageSize.value);
}

function handleChangeSize(val) {
  console.log('每页展示数改变了', val);
  pageSize.value = val;
  getList(currentPage.value, val);
}

function getList(page, size) {
  console.log(`调用接口了, page: ${page}, size: ${size}`);
  return Promise.resolve([page, size]);
}
</script>

解决过程与方案

我在 github 上找到了对应的 issue,但根据回复,这是属于组件合理的表现,那么只能自己来处理这块逻辑了。

问题的本质是,在每页展示数变大时,触发了 size-change 事件,同时当前页数超过了最大有效页数,分页组件内部修改了当前页数为最大有效页数,从而也触发了 current-change 事件。

知道了原因,那么修改当前页数为最大有效页数这件事我们自己做,就能避免出现问题。

代码如下:

vue
<template>
  <el-pagination :current-page="currentPage" :page-size="pageSize" :total="total" background
    layout="total, prev, pager, next, sizes" @update:current-page="handleChangePage"
    @update:page-size="handleChangeSize" />
</template>

<script setup>
import { ref, watch } from 'vue';

const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(50);

function handleChangePage(val) {
  console.log('当前页数改变了', val);
  currentPage.value = val;
  // getList(val, pageSize.value);
}

function handleChangeSize(val) {
  console.log('每页展示数改变了', val);
  pageSize.value = val;
  // 注意这里要使用val,而不是pageSize.value,因为vue的数据更新是异步的
  // 当前页数超出最大有效页数时,重置当前页数为最大有效页数
  if (currentPage.value * val > total.value) {
    const validPage = Math.ceil(total.value / val);
    currentPage.value = validPage;
  }
  // getList(currentPage.value, val);
}

function getList(page, size) {
  console.log(`调用接口了, page: ${page}, size: ${size}`);
  return Promise.resolve([page, size]);
}

// 为了方便,使用watch一起监听当前页数和每页展示数
watch([currentPage, pageSize], ([newCurrentPage, newPageSize]) => {
  getList(newCurrentPage, newPageSize);
})
</script>

参考链接