注:本文分页组件用原生 html + css 实现,element-ui里有专门的分页组件可以不用自己写,详情见另一篇博客:https://www.cnblogs.com/zdd2017/p/11153527.html

表格分页有两种实现方式:前端分页和后端分页。前端分页会一次性从后端拿到所有数据,然后分页展示在页面上,适合数据量比较小的情况;后端分页是每次从后端拿到当前页的数据展示在页面上,也就是说每次切换页码时都要向后端发起请求,适合数据量比较大的情况。本文采用后端分页,要介绍的是采用后端分页方法时的前端写法。

首先我们写一个分页组件 pagination.vue, 效果如下:

我们来分析一下这个组件的实现,首先"《" 、"首页"、 "尾页" 、"》" 这四个地方是固定不变的,再定义一个变量pageGroup表示分页条数,这里的pageGroup=5,大于5的时候右边会出现"...",当前页大于Math.ceil(pageGroup / 2)时左边会出现"..."。选择页码时,显示的分页也会跟着变化,这里我们用一个数组存储所有页码,然后根据点击的页码分割数组得到想要的部分,下面来看一下具体实现代码:

<template>
<nav>
<ul class="pagination">
<li :class="{'disabled': current == 1}"><a href="javascript:;" @click="setCurrent(current - 1)"> « </a></li>
<li :class="{'disabled': current == 1}"><a href="javascript:;" @click="setCurrent(1)"> 首页 </a></li>
<li v-for="p in grouplist" :key="p.id" :class="{'active': current == p.val}">
<a href="javascript:;" @click="setCurrent(p.val)"> {{ p.text }} </a>
</li>
<li :class="{'disabled': current == page}"><a href="javascript:;" @click="setCurrent(page)"> 尾页 </a></li>
<li :class="{'disabled': current == page}"><a href="javascript:;" @click="setCurrent(current + 1)"> »</a></li>
</ul>
</nav>
</template>
<script type="es6">
export default{
data () {
return {
current: this.currentPage
};
},
props: {
total: {// 数据总条数
type: Number,
default: 0
},
display: {// 每页显示条数
type: Number,
default: 10
},
currentPage: {// 当前页码
type: Number,
default: 1
},
pagegroup: {// 分页条数
type: Number,
default: 5,
coerce: function (v) {
v = v > 0 ? v : 5;
return v % 2 === 1 ? v : v + 1;
}
}
},
computed: {
page: function () { // 总页数
return Math.ceil(this.total / this.display);
},
grouplist: function () { // 获取分页页码
let len = this.page;
let temp = [];
let list = [];
let count = Math.floor(this.pagegroup / 2);
let center = this.current;
if (len <= this.pagegroup) {
for (let i = 1; i <= len; i++) {
list.push({text: i, val: i});
}
return list;
}
for (let i = 1; i <= this.page; i++) {
temp.push(i);
}
(center < count + 1) && (center = count + 1); // 当前页是开头几页时保持center是count + 1不变
(center > this.page - count) && (center = this.page - count); // 当前页是末尾几页时保持center是this.page-count不变
temp = temp.splice(center - count - 1, this.pagegroup);
for (let j = 0; j < temp.length; j++) {
list.push({
text: temp[j],
val: temp[j]
});
}
(this.current > count + 1) && list.unshift({text: '...', val: list[0].val - 1});
(this.current < this.page - count) && list.push({text: '...', val: list[list.length - 1].val + 1});
return list;
}
},
methods: {
setCurrent: function (idx) {
if (this.current !== idx && idx > 0 && idx < this.page + 1) {
this.current = idx;
this.$emit('pagechange', this.current);
}
}
}
};
</script>
<style lang="less">
.pagination {
overflow: hidden;
display: table;
margin: 0 auto;
height: 30px;
border: 1px solid rgb(241, 241, 241);
border-radius: 5px;
li {
list-style:none;
float: left;
height: 30px;
border-radius: 5px;
margin: 3px;
&:hover {
background: #000;
a {
color: #fff;
}
}
a {
display: block;
width: 30px;
height: 30px;
text-align: center;
line-height: 30px;
font-size: 12px;
color: #666;
text-decoration: none
}
}
.active {
background: #000;
a {
color: #fff;
}
}
}
</style>

然后我们在父组件里去引用这个分页组件,用vue2.0 + Element UI写好表格,并传参给分页组件

<template>
<div class="index">
<div class="grid">
<el-table :data="tableData" border style="margin-bottom:14px;">
<el-table-column width="55" type="selection" align="center"></el-table-column>
<el-table-column property="id" label="队列号" align="center"></el-table-column>
<el-table-column property="queueName" label="队列名" align="center"></el-table-column>
<el-table-column property="filed" label="队列内容" align="center"></el-table-column>
<el-table-column property="hdfsdir" label="hdfs目录" align="center"></el-table-column>
<el-table-column property="localDir" label="本地目录" align="center"></el-table-column>
</el-table>
<v-pagination :total="total" :display="display" :current-page='current' @pagechange="pagechange"></v-pagination>
</div>
</div>
</template>

在data里注册需要用到的一些变量

data () {
return {
tableData: [],
total: 0,
limit: 10,
current: 1
};
}

现在我们需要向后端请求数据,需要传给后端的参数是当前页即首页currenPage=1以及每页显示的数据量(这里假设为10)

created () {
Axios.get('/queue/online?page=1&limit=10')
.then((response) => {
// list数组是后端返回的10条数据
this.tableData = response.data.list;
})
.catch((error) => {
console.log(error);
});
},

这样我们表格中就出现了从后端拿到的第一页的10条数据,当我们点击页码时,也要向后端重新发起请求

methods: {
pagechange (currentPage) {
// console.log(currentPage); // ajax请求, 向后台发送 currentPage, 来获取对应的数据
Axios.get('/queue/online?page=' + currentPage + '&limit=' + this.display)
.then((response) => {
this.tableData = response.data.list;
})
.catch((error) => {
console.log(error);
});
}
}

至此已可实现表格分页效果,希望能对大家有所帮助。

vue2.0 + Element UI + axios实现表格分页的更多相关文章

  1. Vue2.0+ElementUI+PageHelper实现的表格分页

    Vue2.0+ElementUI+PageHelper实现的表格分页 前言 最近做了一些前端的项目,要对表格进行一些分页显示.表格分页的方法有很多,从宏观上来说分为物理分页和逻辑分页,由于逻辑分页(即 ...

  2. vue2.0+Element UI 表格前端分页和后端分页

    之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...

  3. vue2.0 + element ui 实现表格穿梭框

    element ui 官网里介绍了穿梭框(Transfer),但在实际使用过程中,会出现一些问题: 1.穿梭框里能放置的内容太少,不能满足复杂的业务需求. 2.当选项过多时,穿梭框很难实现分页,左右两 ...

  4. vue2.0+Element UI 实现动态表单(点击按钮增删一排输入框)

    对于动态增减表单项,Element UI 官方文档表单那一节已经介绍得很清楚了,我之前没有看见,绕了很多弯路,这里针对点击按钮增删一排输入框的问题做一个总结. 效果图如下 存在一排必填的姓名与手机号, ...

  5. vue2.0 element学习

    1,bootstrap和vue2.0结合使用 vue文件搭建好后,引入jquery和bootstrap 我采用的方式为外部引用 在main.js内部直接导入 用vue-cli直接安装jquery和bo ...

  6. element ui table(表格)点击一行展开

    element ui是一个非常不错的vue的UI框架,element对table进行了封装,简化了vue对表格的渲染. element ui表格中有一个功能是展开行,在2.0版本官网例子中,只可以点击 ...

  7. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  8. vue2.0+element+node+webpack搭建的一个简单的后台管理界面

    闲聊: 今天是六一儿童节哟,小颖祝大家节日快乐哈哈哈.其实这个demo小颖断断续续做了将近两个礼拜了,心塞的,其实这个也没有多难,主要是小颖有点最近事情有点多,所以就把这个一直拖着,今天好不容易做好了 ...

  9. 2021新年 Vue3.0 + Element UI 尝鲜小记

    2021年,又是新的一年,Vue 已经发布 3.0 版本,最好用的 UI 组件库 Element UI 也发布了适配 Vue3.0 的新版本,是时候开始学习一下这两个新技术. 本文主要记录了使用 Vu ...

随机推荐

  1. 苏浪浪 201771010120 第四周 Java基本程序设计总结

    第四章   对象与类 学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定义类的基本使用方法,熟悉Math类.String类.math类.Scanner类.Lo ...

  2. poj2455 k条路最小化最长边

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12414   Accepted ...

  3. python+selenium 自动化测试框架-学习记录

     本人小白一枚,想着把学习时的东西以博客的方式记录下来,文章中有不正确的地方请大佬多多指点!!共同学习 前期准备 安装python3.selenium.下载对应版本的webdriver:安装所需的第三 ...

  4. Pygame 框架安装教程(Python3.6为例)

    1.python版本是3.6,最新的pygame是1.9.3,这两个最好都用32位的. pygame1.9.3下载地址:http://www.lfd.uci.edu/~gohlke/pythonlib ...

  5. 粒子群优化算法对BP神经网络优化 Matlab实现

    1.粒子群优化算法 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作 ...

  6. Docker 入门:Dockerfile

    主要内容: 什么是 Dockerfile 查看 DockerHub 中镜像的 Dockerfile Dockerfile 编写 Dockerfile 常用命令 什么是 Dockerfile 使用 Do ...

  7. Vim的三款实用插件

    Vim 是 Linux 下的常用文本编辑器,但也经常被称为是一个上古神器,因为它对于初学者而言相当不友好,也不好入门. 但是,对于高手而言,他们不仅将 Vim 玩得很溜,而且还将它当作代码开发的主要工 ...

  8. css 图片宽度、居中、倒影

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. C实现进程间通信(管道; 共享内存,信号量)

    最近学习了操作系统的并发:以下是关于进程间实现并发,通信的两个方法. 例子: 求100000个浮点数的和.要求: (1)随机生成100000个浮点数(父进程). (2)然后创建4个后代进程,分别求25 ...

  10. django-CBV刨析、模板层

    今日内容概要 CBV源码剖析 模版层 模版语法传值 模版语法之过滤器 模版语法之标签 自定义过滤器.标签及inclusion_tag 模版的继承 模版的导入 FBV与CBV ""& ...