经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
Element-UI踩坑之Pagination组件的使用
来源:jb51  时间:2018/10/30 9:05:13  对本文有异议

先说结论:在改变pageSize时,若当前的currentPage超过了最大有效值,就会修改为最大有效值。

一般Pagination组件的声明如下:

  1. <el-pagination
  2. @size-change="handleSizeChange"
  3. @current-change="handleCurrentChange"
  4. :page-size="pageSize"
  5. :current-page="currentPage"
  6. :total="total"
  7. :page-sizes="[10, 20, 50, 100, 200, 300, 400]"
  8. layout="total, sizes, prev, pager, next, jumper">
  9. </el-pagination>

数据都是异步获取的,所以会定义一个获取数据的方法:

  1. getData() {
  2. const params = {
  3. pageSize: this.pageSize,
  4. currentPage: this.currentPage
  5. };
  6.  
  7. get(params).then(res => {
  8. if (res.status === 0) {
  9. ...
  10. this.total = res.result.count;
  11. }
  12. });
  13. }
  14.  

一般我们会在pageSize或currentPage改变时,再次去获取新数据:

  1. handleSizeChange(val) {
  2. this.pageSize = val;
  3. this.getData();
  4. },
  5. handleCurrentChange(val) {
  6. this.currentPage = val;
  7. this.getData();
  8. }

以上都符合常理,看起来没什么问题!但是,来看以下这种特殊情况:

假设有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

  1. watch: {
  2. internalCurrentPage: {
  3. immediate: true,
  4. handler(newVal, oldVal) {
  5. newVal = parseInt(newVal, 10);
  6.  
  7. /* istanbul ignore if */
  8. if (isNaN(newVal)) {
  9. newVal = oldVal || 1;
  10. } else {
  11. // 注意这里
  12. newVal = this.getValidCurrentPage(newVal);
  13. }
  14.  
  15. if (newVal !== undefined) {
  16. this.internalCurrentPage = newVal;
  17. if (oldVal !== newVal) {
  18. this.$emit('currentPage', newVal);
  19. }
  20. } else {
  21. this.$emit('currentPage', newVal);
  22. }
  23. }
  24. }
  25. }

注意我注释标明的地方:

  1. newVal = this.getValidCurrentPage(newVal)

方法名getValidCurrentPage,顾名思义 获取有效的当前页

以上两点足以证明,Element-UI中的Pagination组件会修改currentPage为一个有效值!

具体看看getValidCurrentPage方法的实现:

  1. getValidCurrentPage(value) {
  2. value = parseInt(value, 10);
  3. const havePageCount = typeof this.internalPageCount === 'number';
  4.  
  5. let resetValue;
  6. if (!havePageCount) {
  7. if (isNaN(value) || value < 1) resetValue = 1;
  8. } else {
  9. if (value < 1) {
  10. resetValue = 1;
  11. } else if (value > this.internalPageCount) {
  12. // 注意这里
  13. resetValue = this.internalPageCount;
  14. }
  15. }
  16.  
  17. if (resetValue === undefined && isNaN(value)) {
  18. resetValue = 1;
  19. } else if (resetValue === 0) {
  20. resetValue = 1;
  21. }
  22.  
  23. return resetValue === undefined ? value : resetValue;
  24. }
  25.  

重点看这句代码:

  1. else if (value > this.internalPageCount) {
  2. resetValue = this.internalPageCount;
  3. }

这里就是我们遇到的特殊情况,在改变pageSize时,若当前的currentPage超过了最大有效值,就会修改为最大有效值!

其实Element-UI修改的说法并不正确,它只是向上派发了事件,最终修改值的是我们自己。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号