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 设计模式 推荐
Oct 28 Javascript
Jquery实现三层遍历删除功能代码
Apr 23 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
Jun 05 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
Jun 10 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
微信JS接口大全
Aug 25 Javascript
关于RequireJS的简单介绍即使用方法
Oct 20 Javascript
微信小程序解除10个请求并发限制
Dec 18 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
Jul 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
简单采集了yahoo的一些数据
2007/02/14 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
Laravel 队列使用的实现
2019/01/08 PHP
php多进程应用场景实例详解
2019/07/22 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
javascript操作文本框readOnly
2007/05/15 Javascript
javascript String 的扩展方法集合
2008/06/01 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
详解javascript脚本何时会被执行
2021/02/05 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
替换python字典中的key值方法
2018/07/06 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
详解python中init方法和随机数方法
2019/03/13 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
如何执行一个shell程序
2012/11/23 面试题
护理专业的自荐信
2013/10/22 职场文书
最新的咖啡店创业计划书
2013/12/30 职场文书
新闻报道策划方案
2014/06/11 职场文书
三好学生个人总结
2015/02/15 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB