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数组组合成字符串的脚本
Jan 06 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
jquery ajax同步异步的执行最终解决方案
Apr 26 Javascript
js特殊字符过滤的示例代码
Mar 05 Javascript
jquery 显示*天*时*分*秒实现时间计时器
May 07 Javascript
JS按回车键实现登录的方法
Aug 25 Javascript
js实现图片在未加载完成前显示加载中字样
Sep 03 Javascript
javascript动画算法实例分析
Jul 31 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
Jan 25 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
Mar 15 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
图书管理程序(一)
2006/10/09 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
使用Vue写一个datepicker的示例
2018/01/27 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
质检部岗位职责
2013/11/11 职场文书
购房协议书范本
2014/10/02 职场文书
幼师大班个人总结
2015/02/13 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
作弊检讨书范文
2015/05/06 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python