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系列(15) 函数(Functions)
Apr 12 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
JQuery记住用户名和密码的具体实现
Apr 04 Javascript
用js的document.write输出的广告无阻塞加载的方法
Jun 05 Javascript
jQuery.holdReady()方法用法实例
Dec 27 Javascript
原生javascript获取元素样式
Dec 31 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
js命名空间写法示例
Dec 18 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 Javascript
JQuery 又谈ajax局部刷新
Nov 27 jQuery
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
JS实现简易留言板特效
Dec 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中cookie的使用方法
2014/03/29 PHP
详解PHP PDO简单教程
2019/05/28 PHP
Js切换功能的简单方法
2010/11/23 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
python 生成不重复的随机数的代码
2011/05/15 Python
Python 代码性能优化技巧分享
2012/08/07 Python
Python模块学习 filecmp 文件比较
2012/08/27 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python判断数字是否是超级素数幂
2018/09/27 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
Python csv模块使用方法代码实例
2019/08/29 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
财务会计毕业生个人求职信
2014/02/03 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
优秀党员事迹材料
2014/12/18 职场文书
高中社区服务活动报告
2015/02/05 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技