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 相关文章推荐
DOM 基本方法
Jul 18 Javascript
jquery判断浏览器类型的代码
Nov 05 Javascript
jquery处理页面弹出层查询数据等待操作实例
Mar 25 Javascript
JS中创建函数的三种方式及区别
Mar 13 Javascript
原生JS实现平滑回到顶部组件
Mar 16 Javascript
详解Javascript中的原型OOP
Oct 12 Javascript
JavaScript 栈的详解及实例代码
Jan 22 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
Aug 02 Javascript
react实现菜单权限控制的方法
Dec 11 Javascript
VUE DOM加载后执行自定义事件的方法
Sep 07 Javascript
vue el-table实现递归嵌套的示例代码
Aug 14 Vue.js
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 curl选项列表(超详细)
2013/07/01 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
python海龟绘图实例教程
2014/07/24 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Python的互斥锁与信号量详解
2019/09/12 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
Python双链表原理与实现方法详解
2020/02/22 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
省级优秀毕业生主要事迹
2014/05/29 职场文书
水利水电专业自荐信
2014/07/08 职场文书
物业消防安全责任书
2014/07/23 职场文书
基层党支部承诺书
2015/04/30 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
趣味运动会加油词
2015/07/18 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers