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 相关文章推荐
ie focus bug 解决方法
Sep 03 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
JavaScript操作Cookie详解
Feb 28 Javascript
基于jQuery实现的扇形定时器附源码下载
Oct 20 Javascript
Extjs4.0 ComboBox如何实现三级联动
May 11 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
Sep 05 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
Jul 28 Javascript
Vue导出json数据到Excel电子表格的示例
Dec 04 Javascript
webpack之devtool详解
Feb 10 Javascript
JS中DOM元素的attribute与property属性示例详解
Sep 04 Javascript
Vue.js计算机属性computed和methods方法详解
Oct 12 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一个找二层目录的小东东
2012/08/02 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php设置编码格式的方法
2013/03/05 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
简单的js表单验证函数
2013/10/28 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
详解JS模块导入导出
2017/12/20 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python中lambda()的用法
2017/11/16 Python
python实现画圆功能
2018/01/25 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
python实现数字炸弹游戏程序
2020/07/17 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
Java工程师面试集锦之Spring框架
2013/06/16 面试题
2014年自我评价
2014/01/04 职场文书
幼儿园教研活动方案
2014/01/19 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
大学生自我评价范文
2015/03/03 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS