Vue和elementUI禁用el-pagination的指定分页按钮

本文介绍了如何在前端处理后端设定的最大分页深度限制,通过初始化时和换页时的逻辑判断,禁用超过限制的分页按钮,并给出警告提示。使用Vue.js实现,当分页大小变化或页码切换时,动态检查并禁用无效的分页项,确保前端与后端接口的配合顺畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

后端是Python,有最大分页深度限制(作为前端搞不明白为啥这样限制),数据总量有几十亿条,分页大小10/20/50/100,但是也就是可能有九千万页数据,所以调后端接口获取最大分页深度size,然后超过这个size就禁止这个分页按钮,即:

  • 添加不能点击的样式
  • 添加点击无效的JS逻辑。

效果如下
在这里插入图片描述
在这里插入图片描述

思路

1. 先想初始化的时候怎么实现

分页信息来自列表接口,也就是说首先要在页面初始化的时候比如Vuemounted调接口初始化列表数据的时候做些什么。
在这里插入图片描述
根据观察,乍一看有几千万页,好像有几千万个分页按钮一样,但是实际上,因为有后面的三点按钮每次页面最多只有9个左右的数字分页按钮,所以我只需要获取到所有的数字按钮中的分页数,让它跟最大分页size做比较,如果大于最大可查询分页size就添加一个css 的 class

2. 换页的时候实现

因为当分页大小 size改变的时候,会将当前页重置为首页也就是第一页,而前端可分页大小默认限制在10、20、50、100,而又跟后端确认后台可配置的最大可查询分页深度的最小值1000所以前端分页分页大小的改变不会超出,即不需要考虑它的逻辑。
那就只需要考虑当前页换页的时候的逻辑。换页的时候el-pagination的li的innerText会改变,所以需要先当成初始化判断一次即执行先想初始化的时候怎么实现,然后再根据要跳转的页码和当前的分页大小最大可查询分页深度对比,然后给出提示即可。

代码实现

JS

data(){
	return{
		page: 0,
		size: 10,
		total: 0,
	}
},
mounted(){
	this.initAjaxData();
},
methods: {
	async initAjaxData(){
		const res = await xxxx; // 后端接口
		if (resData.code === 0) {
        	this.total = resData.meta.pagination.total;
        	this.$nextTick(() => {
          		this.initElPageForbiddenBtn();
        	});
      	}
	},
	// 根据每次请求的结果和最大可查询size动态设置分页按钮是否可以点击 操作了DOM
    initElPageForbiddenBtn() {
      const elPagerBtn = document.querySelector('.el-pager');
      const numberNodes = Array.from(elPagerBtn.querySelectorAll('.number'));
      numberNodes.forEach((item) => {
        const currentData = item.innerText; // string
        if (+currentData > this.curMaxPageLimit / this.size) { // curMaxPageLimit 为后端返回的限制
          // eslint-disable-next-line no-param-reassign
          item.className = 'forbidden-click';
        }
      });
    },

    handleCurrentChange(fn, page) {
      this.initElPageForbiddenBtn();
      if ((page * this.size) > this.curMaxPageLimit) {
        this.$message.warning(`网页最大允许查询${this.curMaxPageLimit}条数据!`);
        return;
      }
      this.page = page;
      this[fn]();
    },
}

template

          <el-pagination
            background
            @size-change="(selfSize) => handleSizeChange('initOrgAssetFn', selfSize)"
            @current-change="(selfPage) => handleCurrentChange('initOrgAssetFn', selfPage)"
            :current-page="page"
            :page-sizes="pageSize"
            :page-size="size"
            layout="total, sizes, prev, pager, next, jumper"
            :total="total">
          </el-pagination>

scss

::v-deep .el-pager {
  .forbidden-click{
     pointer-events: none!important;
     opacity: 0.6!important;
  }
}
<think>我们面对的问题是:如何在使用Element UI的el-pagination组件时阻止翻页事件的触发。 通常,我们使用el-pagination时,会监听`current-change`事件(当前页改变时触发)或`size-change`事件(每页条数改变时触发)。如果我们想要阻止翻页事件的触发,实际上是在事件发生之前进行拦截。 思路: 1. 我们可以尝试在事件处理函数中阻止事件的默认行为,但是需要注意的是,el-pagination的事件并不是原生的DOM事件,而是组件内部派发的自定义事件,因此不能使用`event.preventDefault()`。 2. 另一种思路是:在事件处理函数中,根据条件判断,不执行翻页操作,而是保持原来的页码。 具体做法: 我们可以通过一个变量(例如`currentPage`)来绑定el-pagination的`current-page`属性,然后在`current-change`事件触发时,判断是否满足翻页条件。如果不满足,则手动将`currentPage`重置为之前的页码,这样页面就不会翻页。 步骤: 1. 在data中定义当前页码(currentPage)每页条数(pageSize)等变量。 2.el-pagination组件上绑定`current-page`属性为当前页码,并监听`current-change`事件。 3. 在`current-change`事件处理函数中,根据条件判断是否允许翻页。如果不允许,则将currentPage重置为改变前的页码。 注意:由于重置currentPage后,组件会重新渲染,所以需要确保在重置之前已经保存了之前的页码。 示例代码: ```html <template> <el-pagination @current-change="handleCurrentChange" :current-page="currentPage" :page-size="pageSize" :total="total"> </el-pagination> </template> <script> export default { data() { return { currentPage: 1, pageSize: 10, total: 100 }; }, methods: { handleCurrentChange(newPage) { // 假设我们有一个条件:不允许翻到第3页 if (newPage === 3) { // 阻止翻页,将页码重置为改变之前的页码 this.currentPage = this.oldPage; // 这里我们需要记录旧的页码 return; } // 允许翻页,更新当前页码,并执行翻页操作(比如请求数据) this.currentPage = newPage; // 记录旧的页码,为下一次变化做准备 this.oldPage = newPage; // 这里执行数据加载等操作 this.loadData(); } }, mounted() { // 初始化时记录当前页码 this.oldPage = this.currentPage; } }; </script> ``` 但是,上面的代码中,我们使用了一个额外的变量`oldPage`来记录上一次的页码。在每次翻页事件触发时,我们先判断目标页码,如果不符合条件,就重置为`oldPage`,否则更新`oldPage`。 另一种更简洁的方式是使用计算属性或者侦听器,但这里直接使用一个变量来保存旧值是最直观的。 注意:在组件初始化时,我们需要设置`oldPage`的初始值(与currentPage相同)。 另外,如果用户快速点击翻页,可能会出现连续触发事件的情况,我们需要确保在重置页码时,不会因为连续触发而出现问题。因为重置页码会触发组件的重新渲染,但并不会再次触发`current-change`事件(因为事件是由用户点击触发的,而重置页码是通过数据变化触发的渲染,不会触发事件)。 但是,我们也要注意,如果连续快速点击,可能会在条件不满足时连续重置,但逻辑上是没问题的。 还有一种情况是,我们可能需要在条件不满足时给用户一个提示,比如弹窗提示不能翻到该页。 优化:我们可以使用Vue的侦听器来监听currentPage的变化,并在变化时执行操作,但是事件处理函数中已经可以处理,所以使用上述方法即可。 总结:阻止翻页事件触发的核心思想是控制绑定的页码变量,在条件不满足时将其重置为上一次的值。 另外,对于每页条数改变的事件(size-change)也可以采用同样的思路。 但是,如果我们的需求是在某些条件下完全禁止分页组件的操作(比如灰色不可点击),我们可以使用`disabled`属性。不过,el-pagination组件本身没有提供disabled属性来禁用整个分页组件,但我们可以通过CSS或者用div包裹并设置disabled样式来实现,或者使用v-if/v-show隐藏分页组件,但这可能不符合需求(因为只是要阻止翻页,而不是隐藏)。 因此,上述控制页码的方法是最直接的。 相关问题: 1.el-pagination中,除了current-change事件,还有哪些事件? 2. 如何实现el-pagination禁用状态? 3.Vue中,如何监听数据变化并执行异步操作?</think>在 Element UI 的 `el-pagination` 组件中,阻止翻页事件触发的核心思路是**拦截事件并重置页码**。以下是具体实现方法: ### 方法一:通过事件拦截重置页码(推荐) ```html <template> <el-pagination :current-page="currentPage" :page-size="pageSize" :total="total" @current-change="handleCurrentChange" <!-- 拦截翻页事件 --> /> </template> <script> export default { data() { return { currentPage: 1, // 当前页码 pageSize: 10, total: 100, lastValidPage: 1 // 记录最近的有效页码 }; }, methods: { handleCurrentChange(newPage) { // 条件判断:是否允许翻页(示例条件) if (/* 你的阻止条件,例如 newPage === 3 */ false) { // 阻止翻页:重置为上一次的有效页码 this.currentPage = this.lastValidPage; this.$message.warning("禁止跳转到该页码"); } else { // 允许翻页:更新有效页码并执行操作 this.lastValidPage = newPage; this.currentPage = newPage; this.loadData(); // 加载数据 } } } }; </script> ``` ### 方法二:禁用分页按钮(部分阻止) ```html <el-pagination :current-page="currentPage" :page-size="pageSize" :total="total" :disabled="isPaginationDisabled" <!-- 通过变量控制禁用状态 --> @current-change="handleCurrentChange" /> ``` 在 `data` 中定义 `isPaginationDisabled` 变量,在需要时设置为 `true` 即可禁用整个分页组件。 --- ### 关键说明 1. **事件拦截原理** `@current-change` 事件在页码改变**前**触发,通过重置 `currentPage` 为原值可取消翻页效果[^1]。 2. **必要条件** 必须绑定 `current-page.sync` 或 `v-model:current-page`(Vue 3),否则重置无效[^2]。 3. **适用场景** - 表单未保存时阻止翻页 - 特定页码权限控制 - 数据加载期间禁止操作 4. **注意事项** - 不要直接操作 DOM,应通过数据驱动视图 - 对于 `size-change` 事件(每页条数变更),采用相同拦截逻辑 > 示例:当用户尝试跳转到第 3 页时,强制停留在当前页并弹出警告: > ```js > handleCurrentChange(newPage) { > if (newPage === 3) { > this.currentPage = this.lastValidPage; > alert("第 3 页已被禁用!"); > } else { > // ...正常翻页逻辑 > } > } > ``` [^1]: Element UI 分页组件事件在数据更新前触发,可通过重置页码取消效果。 [^2]: 必须使用双向绑定保证视图响应数据变化。 --- ### 相关问题 1. 如何在翻页时拦截请求并显示确认对话框? 2. `el-pagination` 的 `current-change` `size-change` 事件有何区别? 3. 如何实现分页组件与表格数据的联动加载? 4.Vue 3 中使用 Element Plus 的分页组件有何注意事项?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值