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 相关文章推荐
语义化 H1 标签
Jan 14 Javascript
javascript 模式设计之工厂模式学习心得
Apr 27 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
javascript发送短信验证码实现代码
Nov 12 Javascript
详解Angular的双向数据绑定(MV-VM)
Dec 26 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
Mar 13 Javascript
jQuery异步提交表单实例
May 30 jQuery
浅谈Node模块系统及其模式
Nov 17 Javascript
微信小程序左滑动显示菜单功能的实现
Jun 14 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
详解package.json版本号规则
Aug 01 Javascript
antd 表格列宽自适应方法以及错误处理操作
Oct 27 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写杨辉三角实例代码
2011/07/17 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
php 数据结构之链表队列
2017/10/17 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
python类的继承实例详解
2017/03/30 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
详解python中asyncio模块
2018/03/03 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
详解python解压压缩包的五种方法
2019/07/05 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
思想作风建设心得体会
2014/10/22 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
医德医风学习心得体会
2016/01/25 职场文书
旅游安全责任协议书
2016/03/22 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
如何用Python搭建gRPC服务
2021/06/30 Python