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 相关文章推荐
javascript获得服务器端控件的ID的实现代码
Dec 28 Javascript
用javascript判断IE版本号简单实用且向后兼容
Sep 11 Javascript
Backbone.js中的集合详解
Jan 14 Javascript
javascript实现10个球随机运动、碰撞实例详解
Jul 08 Javascript
JavaScript数组各种常见用法实例分析
Aug 04 Javascript
js仿微博实现统计字符和本地存储功能
Dec 22 Javascript
jQuery实现返回顶部功能
Feb 23 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
Feb 25 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
Aug 19 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
JS动画定时器知识总结
Mar 23 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
Python中常见的数据类型小结
2015/08/29 Python
python实现发送邮件功能代码
2017/12/14 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
小结Python的反射机制
2020/09/28 Python
python生成word合同的实例方法
2021/01/12 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
大专毕业生简历的自我评价
2013/10/20 职场文书
客户经理岗位职责
2013/12/08 职场文书
教师产假请假条范文
2014/04/10 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python
python标准库ElementTree处理xml
2022/05/20 Python
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers