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 获取select下拉列表值的代码
Sep 07 Javascript
javascript 检测浏览器类型和版本的代码
Sep 15 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
Apr 21 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
Vue.js 插件开发详解
Mar 29 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
Vue注册组件命名时不能用大写的原因浅析
Apr 25 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 14 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
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
python简单判断序列是否为空的方法
2015/06/30 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
Python统计单词出现的次数
2018/04/04 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
python实现与redis交互操作详解
2020/04/21 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
J2EE中的容器都包括哪些
2013/08/21 面试题
人事助理岗位职责
2013/11/18 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
单独二胎证明
2015/06/24 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL