当前位置:   article > 正文

使用element-ui实现表格分页_element 分页

element 分页

前言

由于项目需要,我使用到了element-ui,当需要使用到表格分页功能的时候,就遇到了一些问题,但通过努力还是解决了,接下来就让我讲一下我对于element-ui中的分页功能的了解(因为这次讲的是表格的分页,所以接下来的内容会与表格联系在一起)。

表格分页

官网地址:https://element.eleme.cn/#/zh-CN/component/pagination

一、前端分页

所谓的前端分页就是用请求从后台把所有的数据拿下来,然后进行分页,如果当数据足够大时,网页就会加载的很慢,唯一的好处就是只需要向后台请求一次就可以了。
例子:
在这里插入图片描述
上面就是一个分好页的表格,接下来我为大家逐步讲解一下。

1. 创建表格

首先,创建一个表格,并将数据填充到表格中:
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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

script标签中添加数据

<!--固定数据-->
data() {
   return {
       tableData: [     //在<el-tabel>标签里的 :data的值是tabelData,表示表格的数据都在tabelData中,所以是这个写法。
        {……}   //数据,在此省略
        ]
   }
}

<!--动态数据-->
<!--向后台请求数据,在vue中,推荐使用axios请求-->

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

说明一下:
el-tabel标签中的

data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"

  • 1
  • 2

slice(a,b)的作用是从已有的数组中返回选定的元素"a"表示开始,"b"表示结束。
currentPagepageSize在此网页的作用会在接下来进行说明。

2、分页表格

接下来为表格进行分页:
在这里插入图片描述
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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其中:
:current-page的值表示当前是第几页;
:page-sizes的值表示可以选择一页多少条;
:page-size的值表示当前一页显示几条;
layout的值表示分页需要显示的内容,例如“total” 表示总数、“next” 表示下一页等;
:total的值表示总共有多少条数据;

因为currentPagepageSize并不是具体的值,所以需要在script标签中的data()中为其进行赋值。于是在上面说到的slice大家都应该知道其作用了吧。在当所有的值都存在时,在界面上会自动把分的页显示出来,如上图中的:1、2、3……6。

3. 添加事件

因为分页需要实现的是点击不同的页数会显示响应的数据,于是还需要再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 保持一致

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4. 完整前端分页代码

<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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

二、后端分页

所谓的后端分页就是数据在后台已经分好页了,前端只需要用请求去获取数据即可,后端分页的好处是只会把当前页的数据给拿下来,网页加载的速度会很快,但是不足就是每跳转一次,前端都要向后台发送一次请求。

例子:
在这里插入图片描述
由于创建的步骤同上,所以在此跳过,直接进入下一步。

1.编写请求数据的函数

因为后台已经帮我们分好页了,我们只需要根据页数的不同,向后台发送不同的请求就可以了。
此网页的请求代码如下:

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);
		})
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

因为我这里后台传来了当前页数、总数,所以在data 中的对应数据就失效了,例如下图的 totalpageSize
在这里插入图片描述

2.引用请求函数

首先需要显示第一页的数据,于是网页加载的时候就需要执行一次,所以在mounted()中添加如下代码:

mounted(){
	this.getlivestockInfo(1);  //因为刚加载显示第一页的数据,所以为1.
},

  • 1
  • 2
  • 3
  • 4

其次,每当我们换页的时候就需要向后台请求一次,所以在handleCurrentChange(val)中引用函数:

handleCurrentChange(val) {
    console.log(`当前页: ${val}`);
    this.currentPage = val;
	this.getlivestockInfo(val);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.完整后端分页代码

<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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

结尾

到此,我个人对于前端分页和后端分页的理解就全部完了,需要注意的是当我们使用后端分页时,要注意前端就不能进行分页了,前端就只负责请求,后台已经把页分好了,不然你的页面就只会显示第一页的数据,其他页都是显示“暂无数据”;前端分页相对来说不会这么麻烦,但还是要多注意。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/103146
推荐阅读
相关标签
  

闽ICP备14008679号