Element-UI踩坑之Pagination组件的使用


Posted in Javascript onOctober 29, 2018

先说结论:在改变pageSize时,若当前的currentPage超过了最大有效值,就会修改为最大有效值。

一般Pagination组件的声明如下:

<el-pagination 
 @size-change="handleSizeChange" 
 @current-change="handleCurrentChange" 
 :page-size="pageSize" 
 :current-page="currentPage"
 :total="total"
 :page-sizes="[10, 20, 50, 100, 200, 300, 400]" 
 layout="total, sizes, prev, pager, next, jumper">
</el-pagination>

数据都是异步获取的,所以会定义一个获取数据的方法:

getData() {
 const params = {
 pageSize: this.pageSize,
 currentPage: this.currentPage
 };

 get(params).then(res => {
 if (res.status === 0) {
 ...
 this.total = res.result.count;
 }
 });
}

一般我们会在pageSize或currentPage改变时,再次去获取新数据:

handleSizeChange(val) {
 this.pageSize = val;
 this.getData();
},
handleCurrentChange(val) {
 this.currentPage = val;
 this.getData();
}

以上都符合常理,看起来没什么问题!但是,来看以下这种特殊情况:

假设有473条数据,即total = 473

当前pageSize = 10, pageCount = Math.ceil(473 / 10) = 48, currentPage = 48

现在将pageSize = 200,则pageCount = Math.ceil(473 / 200) = 3

这时奇怪的事情就发生了,首先页面的表现为:先是无数据,然后过一会数据才加载。

打开控制台查看网络请求,发现获取了两次数据!

查看请求参数,第一次为:pageSize: 200, currentPage : 48

第二次为:pageSize: 200, currentPage: 3

这好像可以解释了,为什么请求了两次数据?因为pageSize与currentPage的改变都会触发事件去请求数据。

但是!pageSize是我们手动改变的,那currentPage呢?

查看整个组件内可能触发currentPage的行为,但并没有。

那只有一种可能,就是Element-UI库内部帮我们修改的!

秉着不求甚解的理念,去查看了Element-UI中Pagination组件的源码:

其中currentPage在Pagination组件内叫 internalCurrentPage

watch: {
 internalCurrentPage: {
 immediate: true,
 handler(newVal, oldVal) {
 newVal = parseInt(newVal, 10);

 /* istanbul ignore if */
 if (isNaN(newVal)) {
  newVal = oldVal || 1;
 } else {
  // 注意这里 
  newVal = this.getValidCurrentPage(newVal);
 }

 if (newVal !== undefined) {
  this.internalCurrentPage = newVal;
  if (oldVal !== newVal) {
  this.$emit('currentPage', newVal);
  }
 } else {
  this.$emit('currentPage', newVal);
 }
 }
 }
}

注意我注释标明的地方:

newVal = this.getValidCurrentPage(newVal)

方法名getValidCurrentPage,顾名思义 获取有效的当前页

以上两点足以证明,Element-UI中的Pagination组件会修改currentPage为一个有效值!

具体看看getValidCurrentPage方法的实现:

getValidCurrentPage(value) {
 value = parseInt(value, 10);
 
 const havePageCount = typeof this.internalPageCount === 'number';

 let resetValue;
 if (!havePageCount) {
 if (isNaN(value) || value < 1) resetValue = 1;
 } else {
 if (value < 1) {
  resetValue = 1;
 } else if (value > this.internalPageCount) {
  // 注意这里
  resetValue = this.internalPageCount;
 }
 }

 if (resetValue === undefined && isNaN(value)) {
 resetValue = 1;
 } else if (resetValue === 0) {
 resetValue = 1;
 }

 return resetValue === undefined ? value : resetValue;
 }

重点看这句代码:

else if (value > this.internalPageCount) {
 resetValue = this.internalPageCount;
}

这里就是我们遇到的特殊情况,在改变pageSize时,若当前的currentPage超过了最大有效值,就会修改为最大有效值!

其实Element-UI修改的说法并不正确,它只是向上派发了事件,最终修改值的是我们自己。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
判断用户的在线状态 onbeforeunload事件
Mar 05 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
Dec 11 Javascript
jquery实现省市select下拉框的替换(示例代码)
Feb 22 Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
Sep 17 Javascript
JavaScript SHA512加密算法详细代码
Oct 06 Javascript
JavaScript和jQuery制作光棒效果
Feb 24 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 Javascript
JavaScript中EventLoop介绍
Jan 22 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
js中this的指向问题归纳总结
Nov 28 Javascript
vue-router权限控制(简单方式)
Oct 29 #Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 #Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 #Javascript
vue 本地服务不能被外部IP访问的完美解决方法
Oct 29 #Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 #Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
Oct 29 #Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
Oct 29 #Javascript
You might like
php.ini中文版
2006/10/09 PHP
PHP脚本的10个技巧(6)
2006/10/09 PHP
PHP实现下载功能的代码
2012/09/29 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
js实现简单点赞操作
2020/03/17 Javascript
Vue 组件的挂载与父子组件的传值实例
2020/09/02 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
PyQt5实现拖放功能
2018/04/25 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
2020/06/06 Python
Python Map 函数的使用
2020/08/28 Python
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
优秀护士演讲稿
2014/04/30 职场文书
要账委托书范本
2014/09/15 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2016大一新生军训感言
2015/12/08 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs