Element-UI踩坑之Pagination组件的使用

先说结论:在改变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修改的说法并不正确,它只是向上派发了事件,最终修改值的是我们自己。

以上是 Element-UI踩坑之Pagination组件的使用 的全部内容, 来源链接: utcz.com/z/346384.html

回到顶部