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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
Javascript实现运算符重载详解
Apr 07 Javascript
Vue项目全局配置微信分享思路详解
May 04 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
Aug 26 Javascript
layui使用label标签的方法
Sep 14 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 Javascript
jquery插件实现轮播图效果
Oct 19 jQuery
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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP 编程安全性小结
2010/01/08 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
微信小程序组件 marquee实例详解
2017/06/23 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
python开发之文件操作用法实例
2015/11/13 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
Python图片的横坐标汉字实例
2019/12/04 Python
Python数组并集交集补集代码实例
2020/02/18 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
食品流通安全承诺书
2014/05/22 职场文书
五四青年节演讲稿
2014/05/26 职场文书