vue分页组件table-pagebar使用实例解析


Posted in Javascript onNovember 15, 2020

之前一直接触都是原始的前端模型,jquery+bootstrap,冗杂的dom操作,繁琐的更新绑定。接触vue后,对前端MVVM框架有了全新的认识。本文是基于webpack+vue构建,由于之前的工作主要是基于java的服务端开发工作,对前端框架和组件的理解,不够深入,借此来记录在前端框架使用和构建中的点点滴滴。

此分页组件参照于bootstrap-datatable底部分页开发完成,相关参数增加自定义功能。

最终使用展现效果图如下,数据来源于cnodejs【https://cnodejs.org/】 

vue分页组件table-pagebar使用实例解析

底部分页组件主要由左侧当前数据项数量显示和右侧分页页码两部分组成。组件代码如下: 

<template xmlns:v-on="http://www.w3.org/1999/xhtml"
 xmlns:v-bind="http://www.w3.org/1999/xhtml">
 <div class="page-bar">
 <div class="page-size">
 <div>
 <select v-on:change="menuChange()" v-model="limit">
 <option v-for="item in menu" v-bind:value="item">{{item}}</option>
 </select>
 记录/页,显示第 {{start}} 至 {{end}} 项记录,共 {{totalSize}} 项
 </div>
 </div>
 <div class="page-con">
 <ul>
 <li><a v-on:click="firstClick()" v-bind:class="{ 'disabled': cur == 1}">首页</a></li>
 <li><a v-on:click="preClick()" v-bind:class="{ 'disabled': cur == 1}">上一页</a></li>
 <li v-for="per in pages" v-bind:class="{ 'active': cur == per}">
 <a v-on:click="pageClick(per)">{{ per }}</a>
 </li>
 <li><a v-on:click="nextClick()" v-bind:class="{ 'disabled': cur == totalPage}">下一页</a></li>
 <li><a v-on:click="lastClick()" v-bind:class="{ 'disabled': cur == totalPage}">尾页</a></li>
 <li><a>共<i>{{totalPage}}</i>页</a></li>
 </ul>
 </div>
 <div class="clear-both"></div>
 </div>
</template>

<script>
 import Ajax from '../ajax'

 export default{
 props: ['page-model'],
 data () {
 return {
 // 初始页
 cur: 1,
 // 请求地址
 url: this.pageModel.url ? this.pageModel.url : "",
 // 请求参数
 param: this.pageModel.param ? this.pageModel.param : {},
 // 请求方法 默认为GET请求
 method: this.pageModel.method ? this.pageModel.method : 'GET',
 // 每页显示数量 默认每页显示10条
 limit: this.pageModel.menu ? this.pageModel.menu[0] : 10,
 // 底部分页基数 默认5
 perSize: this.pageModel.perSize ? this.pageModel.perSize : 5,
 // 每页显示数量 下拉选项
 menu: this.pageModel.menu ? this.pageModel.menu : [5, 10, 50],
 // 分页参数 自定义名称
 pageParamName: this.pageModel.pageParamName ? this.pageModel.pageParamName : ['page', 'limit'],
 // 当前列表显示记录起始数
 start: 0,
 // 当前列表显示记录结束数
 end: 0,
 // 总页数
 totalPage: 0,
 // 记录总数
 totalSize: 0,
 // 分页请求返回数据
 dataList: []
 }
 },
 ready () {
 this.getData();
 },
 methods: {
 // 首页
 firstClick: function () {
 if (this.cur > 1) {
 this.cur = 1;
 this.getData();
 }
 },
 // 尾页
 lastClick: function () {
 if (this.cur < this.totalPage) {
 this.cur = this.totalPage;
 this.getData();
 }
 },
 // 上一页
 preClick: function () {
 if (this.cur > 1) {
 this.cur--;
 this.getData();
 }
 },
 // 下一页
 nextClick: function () {
 if (this.cur < this.totalPage) {
 this.cur++;
 this.getData();
 }
 },
 // 页码
 pageClick: function (data) {
 if (data != this.cur) {
 this.cur = data;
 this.getData();

 }
 },
 // 刷新显示记录数
 refreshPageCon: function () {
 this.start = (this.cur - 1) * this.limit + 1;
 if (this.totalSize >= this.limit * this.cur) {
 this.end = this.limit * this.cur;
 } else {
 this.end = this.totalSize;
 }
 },
 // 分页请求
 getData: function () {
 let _this = this;
 this.param[this.pageParamName[0]] = this.cur;
 this.param[this.pageParamName[1]] = this.limit;
 Ajax({
 url: _this.url,
 method: _this.method,
 data: _this.param,
 callback: function (res) {
 // 返回结果数据集
 this.dataList = res.data;
 // 返回总记录数
 _this.totalSize = 25;

 _this.totalPage = Math.ceil(_this.totalSize / _this.limit);
 _this.refreshPageCon();
 _this.$dispatch('refresh', this.dataList);
 }
 });
 },
 // 每页显示记录数 下拉
 menuChange: function () {
 this.getData();
 },
 getPage: function (curPage, totalPage, pageNum) {
 var leftPage, rightPage;
 curPage = curPage > 1 ? curPage : 1;
 curPage = curPage > totalPage ? totalPage : curPage;
 totalPage = curPage > totalPage ? curPage : totalPage;
 // 左侧页数
 leftPage = curPage - Math.floor(pageNum / 2);
 leftPage = leftPage > 1 ? leftPage : 1;

 // 右侧页数
 rightPage = curPage + Math.floor(pageNum / 2);
 rightPage = rightPage > totalPage ? totalPage : rightPage;

 var curPageNum = rightPage - leftPage + 1;
 // 左侧调整
 if (curPageNum < pageNum && leftPage > 1) {
 leftPage = leftPage - (pageNum - curPageNum);
 leftPage = leftPage > 1 ? leftPage : 1;
 curPageNum = rightPage - leftPage + 1;
 }

 // 右侧调整
 if (curPageNum < pageNum && rightPage < totalPage) {
 rightPage = rightPage + (pageNum - curPageNum);
 rightPage = rightPage > totalPage ? totalPage : rightPage;
 }

 var arr = [];
 for (var i = leftPage; i <= rightPage; i++) {
 arr.push(i);
 }
 return arr;
 }
 },
 computed: {
 pages: function () {
 return this.getPage(this.cur, this.totalPage, this.perSize);
 }
 }
 }
</script>

<style>
 ul, li {
 margin: 0px;
 padding: 0px;
 }

 li {
 list-style: none;
 display: inline;
 }

 .page-bar li:first-child > a {
 margin-left: 0px
 }

 .page-bar a {
 border: 1px solid #ddd;
 text-decoration: none;
 position: relative;
 float: left;
 padding: 6px 12px;
 margin-left: -1px;
 line-height: 1.42857143;
 color: #337ab7;
 cursor: pointer;
 }

 .page-bar a:hover {
 background-color: #eee;
 }

 .page-bar .active a {
 color: #fff;
 cursor: default;
 background-color: #337ab7;
 border-color: #337ab7;
 }

 .page-bar i {
 font-style: normal;
 color: #d44950;
 margin: 0px 4px;
 font-size: 12px;
 }

 .page-bar .page-con, .page-size {
 width: 50%;
 display: block;
 height: 30px;
 float: left;
 line-height: 30px;
 }

 .page-bar .page-con ul {
 float: right;
 padding-left: 15px;
 padding-right: 15px;
 display: inline-block;
 padding-left: 0;
 }

 .page-bar .page-size div {
 padding-left: 15px;
 padding-right: 15px;
 font-size: 14px;
 }

 a.disabled {
 color: #777;
 background-color: #fff;
 border-color: #ddd;
 cursor: not-allowed;
 }

 a.disabled:hover {
 background-color: #fff;
 }

 .clear-both {
 clear: both;
 }

 select {
 border: solid 1px #ddd;
 appearance: none;
 -moz-appearance: none;
 -webkit-appearance: none;
 background: url("../assets/images/arrow.png") no-repeat scroll right center transparent;
 padding-right: 15px;
 padding-left: 15px;
 padding-top: 2px;
 padding-bottom: 2px;
 }

 select::-ms-expand {
 display: none;
 }
</style>

组建模块使用, 

<template>
 <Navbar></Navbar>
 <div class="row">
 <table class="table">
 <thead>
 <tr>
 <th>标题</th>
 <th width="20%">发布时间</th>
 <th width="10%">作者</th>
 <th width="10%">回复数</th>
 <th width="10%">访问数</th>
 </tr>
 </thead>
 <tbody>
 <tr v-show="!tabelEmpty" v-for="item in dataList">
 <td>{{item.title}}</td>
 <td>{{item.create_at}}</td>
 <td>{{item.author.loginname}}</td>
 <td>{{item.reply_count}}</td>
 <td>{{item.visit_count}}</td>
 </tr>
 <tr v-show="tabelEmpty" class="empty">
 <td colspan="5">没有匹配的记录</td>
 </tr>
 </tbody>
 </table>
 </div>
 <Pagebar :page-model="pageModel"></Pagebar>
</template>
<script>
 import Navbar from '../components/navbar.vue'
 import Pagebar from '../components/table-pagebar.vue'

 export default {//这里是官方的写法,默认导出,ES6
 components: {
 Navbar,
 Pagebar
 },
 data () {
 return {
 allArticle: "",
 dataList: [],
 pageModel: {
 url: 'https://cnodejs.org/api/v1/topics',
 menu: [5, 10, 20]
 },
 }
 },
 computed: {
 tabelEmpty: function () {
 if (this.dataList) {
 return false;
 } else {
 return true;
 }
 }
 },
 events: {
 refresh: function (e) {
 this.dataList = e;
 }
 }
 }
</script>
<style>
 body, table {
 font-size: 12px;
 }

 table {
 table-layout: fixed;
 empty-cells: show;
 border-collapse: collapse;
 width: 100%;
 margin: 10px 0;
 }

 td {
 height: 30px;
 }

 div.row {
 margin-left: 15px;
 margin-right: 15px;
 }

 h1, h2, h3 {
 font-size: 12px;
 margin: 0;
 padding: 0;
 }

 .table {
 border: 1px solid #ddd;
 background: #fff;
 }

 .table thead tr {
 background: #eee;
 }

 .table th {
 background-repeat: repeat-x;
 height: 30px;
 text-align: left;
 vertical-align: middle;
 }

 .table tr.empty {
 text-align: center;
 }

 .table td, .table th {
 border: 1px solid #ddd;
 padding: 0 1em 0;
 }

 .table tr:nth-child(odd) td {
 background-color: #f5f5f5;

 }
</style>

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

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

Javascript 相关文章推荐
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
当json键为数字时的取值方法解析
Nov 15 Javascript
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
纯js实现遮罩层效果原理分析
May 27 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
javascript数据类型示例分享
Jan 19 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
jQuery中Find选择器用法示例
Sep 21 Javascript
Node.js Buffer模块功能及常用方法实例分析
Jan 05 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
Mar 19 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 #Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
Aug 10 #Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 #Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 #Javascript
JS获取鼠标选中的文字
Aug 10 #Javascript
浅析JavaScript函数的调用模式
Aug 10 #Javascript
JavaScript实现刷新不重记的倒计时
Aug 10 #Javascript
You might like
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
pandas实现导出数据的四种方式
2020/12/13 Python
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
美国在线购物频道:Shop LC
2019/04/21 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
创先争优承诺书范文
2014/03/31 职场文书
初中班主任评语
2014/04/24 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
解除处分决定书
2015/06/25 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python