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对象模型-执行模型
Apr 28 Javascript
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
jquery 鼠标滑动显示详情应用示例
Jan 24 Javascript
extjs_02_grid显示本地数据、显示跨域数据
Jun 23 Javascript
JavaScript日期时间与时间戳的转换函数分享
Jan 31 Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
详解jQuery中的DOM操作
Dec 23 Javascript
Vue学习之路之登录注册实例代码
Jul 06 Javascript
Angular4表单验证代码详解
Sep 03 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
Sep 04 Javascript
layui 实现表格某一列显示图标
Sep 19 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学习 字符串课件
2008/06/15 PHP
php 文件状态缓存带来的问题
2008/12/14 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
PHP钩子实现方法解析
2019/05/21 PHP
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
微信小程序实现分享商品海报功能
2019/09/30 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
Python实现多属性排序的方法
2018/12/05 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Python中如何添加自定义模块
2020/06/09 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
美德少年事迹材料
2014/01/23 职场文书
学生宿舍管理制度
2014/01/30 职场文书
如何书写邀请函?
2019/06/24 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
浅谈MySQL中的六种日志
2022/03/23 MySQL