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 相关文章推荐
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
捕获和分析JavaScript Error的方法
Mar 25 Javascript
js学习总结之dom2级事件基础知识详解
Jul 27 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 Javascript
React Native模块之Permissions权限申请的实例相机
Sep 28 Javascript
JavaScript 有用的代码片段和 trick
Feb 22 Javascript
JS严格模式知识点总结
Feb 27 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
Sep 13 Javascript
使用zrender.js绘制体温单效果
Oct 31 Javascript
在Vue 中获取下拉框的文本及选项值操作
Aug 13 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
Aug 31 Javascript
Vue仿Bibibili首页的问题
Jan 21 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
键盘控制事件应用教程大全
2006/11/24 Javascript
用javascript实现给图片加链接
2007/08/15 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
python分析apache访问日志脚本分享
2015/02/26 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
使用Python绘制图表大全总结
2017/02/11 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
numpy自动生成数组详解
2017/12/15 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
竞聘副主任科员演讲稿
2014/01/11 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
本科应届生自荐信
2014/06/29 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
商场收银员岗位职责
2015/04/07 职场文书
工程合作意向书范本
2015/05/09 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python