赞
踩
由于项目需要,我使用到了element-ui,当需要使用到表格分页功能的时候,就遇到了一些问题,但通过努力还是解决了,接下来就让我讲一下我对于element-ui中的分页功能的了解(因为这次讲的是表格的分页,所以接下来的内容会与表格联系在一起)。
官网地址:https://element.eleme.cn/#/zh-CN/component/pagination
所谓的前端分页就是用请求从后台把所有的数据拿下来,然后进行分页,如果当数据足够大时,网页就会加载的很慢,唯一的好处就是只需要向后台请求一次就可以了。
例子:
上面就是一个分好页的表格,接下来我为大家逐步讲解一下。
首先,创建一个表格,并将数据填充到表格中:
在template
标签中添加如下代码:
<el-table :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)" style="width: 100%">
<el-table-column prop="date" label="日期" width="180">
</el-table-column>
<el-table-column prop="name" label="姓名" width="180">
</el-table-column>
<el-table-column prop="address" label="地址">
</el-table-column>
</el-table>
在script
标签中添加数据
<!--固定数据-->
data() {
return {
tableData: [ //在<el-tabel>标签里的 :data的值是tabelData,表示表格的数据都在tabelData中,所以是这个写法。
{……} //数据,在此省略
]
}
}
<!--动态数据-->
<!--向后台请求数据,在vue中,推荐使用axios请求-->
说明一下:
在el-tabel
标签中的
data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"
slice(a,b)
的作用是从已有的数组中返回选定的元素"a"表示开始,"b"表示结束。
而currentPage
和pageSize
在此网页的作用会在接下来进行说明。
接下来为表格进行分页:
在template
标签中添加
<el-pagination align='center'
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[1,5,10,20]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.length">
</el-pagination>
其中:
:current-page
的值表示当前是第几页;
:page-sizes
的值表示可以选择一页多少条;
:page-size
的值表示当前一页显示几条;
layout
的值表示分页需要显示的内容,例如“total
” 表示总数、“next
” 表示下一页等;
:total
的值表示总共有多少条数据;
因为currentPage
、pageSize
并不是具体的值,所以需要在script
标签中的data()
中为其进行赋值。于是在上面说到的slice
大家都应该知道其作用了吧。在当所有的值都存在时,在界面上会自动把分的页显示出来,如上图中的:1、2、3……6。
因为分页需要实现的是点击不同的页数会显示响应的数据,于是还需要再methods中添加如下代码:
methods: {
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
console.log(`每页 ${val} 条`);
this.currentPage = 1;
this.pageSize = val;
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.currentPage = val;
}
}
//函数名称是自己定义的,可以随便修改,但是记住,要与<el-pagination>标签中的@size-change 和 @current-change 保持一致
<template> <div> <!-- 表格 --> <el-table :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)" style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> </el-table> <!-- 分页器 --> <div class="block" style="margin-top:15px;"> <el-pagination align='center' @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[1,5,10,20]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="tableData.length"> </el-pagination> </div> </div> </template> <script> export default { data() { return { tableData: [ { date: "2016-05-02", name: "第一页", address: "上海市普陀区金沙江路 1518 弄" }, { date: "2016-05-04", name: "第二页", address: "上海市普陀区金沙江路 1517 弄" }, { date: "2016-05-01", name: "第三页", address: "上海市普陀区金沙江路 1519 弄" }, { date: "2016-05-03", name: "第四页", address: "上海市普陀区金沙江路 1516 弄" }, { date: "2016-05-01", name: "第五页", address: "上海市普陀区金沙江路 1519 弄" }, { date: "2016-05-03", name: "第六页", address: "上海市普陀区金沙江路 1516 弄" }, ], currentPage: 1, // 当前页码 total: 20, // 总条数 pageSize: 2 // 每页的数据条数 }; }, methods: { //每页条数改变时触发 选择一页显示多少行 handleSizeChange(val) { console.log(`每页 ${val} 条`); this.currentPage = 1; this.pageSize = val; }, //当前页改变时触发 跳转其他页 handleCurrentChange(val) { console.log(`当前页: ${val}`); this.currentPage = val; } } }; </script>
所谓的后端分页就是数据在后台已经分好页了,前端只需要用请求去获取数据即可,后端分页的好处是只会把当前页的数据给拿下来,网页加载的速度会很快,但是不足就是每跳转一次,前端都要向后台发送一次请求。
例子:
由于创建的步骤同上,所以在此跳过,直接进入下一步。
因为后台已经帮我们分好页了,我们只需要根据页数的不同,向后台发送不同的请求就可以了。
此网页的请求代码如下:
getlivestockInfo(num1){ var that = this; var params = new URLSearchParams(); params.append('pageNum',num1); // params.append('total',this.tableData.total); that.$axios.post('url',params) //"url"处填写后台的接口 .then(response => { // 请求成功 console.log('请求成功'); //因为后台帮助分页,所以后台需要将一些数据传到前端,当然就不止有数据了,例如:数据的总数等等 that.tableData=response.data.data; //response.data.data代表从后台请求到的所有的数据 that.currentPage=num1; //因为每次请求的页数不同,所以采用一个变量代替 that.pageSize=that.tableData.pageSize; that.total=that.tableData.total; console.log(that.tableData.list.length); //我后台的数据中数据是放在数组list中 }).catch(error => { // 请求失败 console.log('请求失败'); console.log(error); }) }
因为我这里后台传来了当前页数、总数,所以在data 中的对应数据就失效了,例如下图的 total
和 pageSize
:
首先需要显示第一页的数据,于是网页加载的时候就需要执行一次,所以在mounted()
中添加如下代码:
mounted(){
this.getlivestockInfo(1); //因为刚加载显示第一页的数据,所以为1.
},
其次,每当我们换页的时候就需要向后台请求一次,所以在handleCurrentChange(val)中引用函数:
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.currentPage = val;
this.getlivestockInfo(val);
}
<template> <div> <!-- 表格 --> <el-table :data="tableData.list" style="width: 100%"> <el-table-column prop="bluetoothId" label="蓝牙编号" width="120"> </el-table-column> <!--设置列标--> <el-table-column prop="species" label="品种" width="120"> </el-table-column> <el-table-column prop="sex" label="性别" width="120"> </el-table-column> <el-table-column prop="outTime" label="预计出售时间" width="200"> </el-table-column> <el-table-column prop="preorderStatus" label="销售情况" width="120"> </el-table-column> </el-table> <!-- 分页器 --> <div class="block" style="margin-top:15px;"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[10, 15, 20, 25]" :page-size="pageSize" layout="total, prev, pager, next, jumper" :total="total"> </el-pagination> </div> </div> </template> <script> export default { data() { return { tableData:{}, currentPage: 1, // 当前页码 total: 20, // 总条数 pageSize: 2 // 每页的数据条数 }; }, mounted(){ this.getlivestockInfo(1); }, methods: { //每页条数改变时触发 选择一页显示多少行 handleSizeChange(val) { console.log(`每页 ${val} 条`); this.currentPage = 1; this.pageSize = val; }, //当前页改变时触发 跳转其他页 handleCurrentChange(val) { console.log(`当前页: ${val}`); this.currentPage = val; this.getlivestockInfo(val); }, getlivestockInfo(num1){ var that = this; var params = new URLSearchParams(); params.append('pageNum',num1); that.$axios.post('url',params) //补上后台接口即可 .then(response => { // 请求成功 console.log('请求成功'); that.tableData=response.data.data; that.currentPage=num1; that.pageSize=that.tableData.pageSize; that.total=that.tableData.total; console.log(that.tableData.list.length); }).catch(error => { // 请求失败 console.log('请求失败'); console.log(error); }) } } }; </script>
到此,我个人对于前端分页和后端分页的理解就全部完了,需要注意的是当我们使用后端分页时,要注意前端就不能进行分页了,前端就只负责请求,后台已经把页分好了,不然你的页面就只会显示第一页的数据,其他页都是显示“暂无数据”;前端分页相对来说不会这么麻烦,但还是要多注意。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。