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实现的支持lrc歌词的播放器
May 17 Javascript
JavaScript中的View-Model使用介绍
Aug 11 Javascript
jQuery文件上传插件Uploadify使用指南
Jun 05 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
js自定义select下拉框美化特效
May 12 Javascript
数据结构中的各种排序方法小结(JS实现)
Jul 23 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
Jul 27 Javascript
解决vue无法设置滚动位置的问题
Oct 07 Javascript
jQuery访问json文件中数据的方法示例
Jan 28 jQuery
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
JavaScript实现点击切换验证码及校验
Jan 10 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
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
《菜园里》教学反思
2014/04/17 职场文书
挂靠协议书范本
2014/04/22 职场文书
三年级评语大全
2014/04/23 职场文书
办理房产证委托书
2014/09/18 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
springboot+VUE实现登录注册
2021/05/27 Vue.js
Mysql 设置boolean类型的操作
2021/06/04 MySQL
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫