Vue.js仿Metronic高级表格(二)数据渲染


Posted in Javascript onApril 19, 2017

上篇使用Vue.js制作仿Metronic高级表格(一)静态设计介绍了需求、原型设计以及静态页面实现,这篇讲解如何使用Vue渲染数据,实现动态展示。

表格数据

先定义一个数组来保存所有数据:

var vm = new Vue({ 
 el:'#content', 
 data: { 
  book_list: [ 
   {id:1, name:"标准日本语", type: "文化", price:19.00, time: 1492502043}, 
   {id:2, name:"微观经济学", type: "经济", price:29.00, time: 1492502143}, 
   {id:3, name:"大数据时代", type: "经济", price:39.00, time: 1492502243}, 
   {id:4, name:"TCP/IP协议详解", type: "科技", price:49.00, time: 1492502343}, 
   {id:5, name:"大学英语", type: "文化", price:59.00, time: 1492502443}, 
  ] 
 } 
});

使用v-for指令来渲染,将tr标签改写成:

<tr v-for="(book, key) in book_list"> 
 <td v-text="key + 1"></td> 
 <td v-text="book.name"></td> 
 <td v-text="book.type"></td> 
 <td v-text="book.price"></td> 
 <td v-text="book.time"></td> 
 <td> 
  <button class="btn btn-info btn-xs"> 
   <i class="fa fa-pencil"></i> 
   修改 
  </button> 
  <button class="btn btn-danger btn-xs"> 
   <i class="fa fa-trash"></i> 
   删除 
  </button> 
 </td> 
</tr>

Vue.js仿Metronic高级表格(二)数据渲染

其指令含义为:遍历book_list对象,将元素赋值给book,索引赋值给key,并且使用元素渲染该tr标签
值得注意的是:
① 应该使用v-text来设置文本值,这样不会出现闪烁问题。
② Vue2.0中,不支持隐式的$index,需要显式声明,例如上述代码中"(book, key) in book_list",key可以看做$index
数据渲染完了,但是看效果会知道,价格、更新时间需要做一些格式调整。
Vue1.0中对于价格的调整可以使用

{{book.price | currency}} 

也就是过滤器,但在Vue2.0中,已废弃默认过滤器了,这意味着我们需要自定义过滤器,并且注册到Vue对象中去。
不难写出currencydate过滤器为:

Vue.filter('date', function (timestamp) { 
 let date = new Date(timestamp*1000); 
 let y = date.getFullYear(); 
 let month = date.getMonth()+1; 
 let d = date.getDate(); 
 let h = date.getHours(); 
 let m = date.getMinutes(); 
 let s = date.getSeconds(); 
 return y + '年'+ 
   (month < 10 ? '0':'') + month + '月' + 
   (d < 10 ? '0':'') + d + '日' + 
   (h < 10 ? '0':'') + h + ':' + 
   (m < 10 ? '0':'') + m + ':' + 
   (s < 10 ? '0':'') + s; 
}); 
Vue.filter('currency', function(money, unit, fixed){ 
 if (isNaN(money)) {return "";} 
 if (typeof fixed == 'undefined' || isNaN(fixed)) { 
  fixed = 2 
 } 
 if (typeof unit =='undefined') { 
  unit = '¥ '; 
 } 
 let num = parseFloat(money); 
 return unit + num.toFixed(fixed); 
});

再次修改tr模板为:

<td>{{book.price | currency}}</td> 
<td>{{book.time | date}}</td>

值得注意的是:过滤器不能和v-text指令配合使用,下述代码无法生效:

<td v-text="book.price | currency"></td> 
<td v-text="book.time | date"></td>

修改后的表格效果如下:

Vue.js仿Metronic高级表格(二)数据渲染

分页展示

分页其实就是只显示原始数据中,索引值在某一个范围内的数据,可以理解为是一种数据的过滤处理.
如果知道了页容量,当前页码,原始数据集,就能计算出当前页要显示哪些数据。
页码从1开始,那么第N页的数据,他的索引(从0开始)范围应该是:(N - 1)*SIZE ~ N*SIZE - 1
由于"分页"这一动作具有普遍性,我们现在methods中定义一个pageData方法:

methods: { 
 pageData: function (data, page_size, page_num) { 
  if (!(data instanceof Array)) {return [];} 
  let start = (page_num - 1)*page_size; 
  return data.slice(start, start + page_size); 
 } 
}

值得注意的是:slice方法返回的是数组的原始元素,而不是数组的备份(copy)。
"当前页的数据" 我们使用计算属性来完成,而不是方法:

computed : { 
 page_book_list: function() { 
  return this.pageData(this.book_list, this.page_size, this.page_num); 
 } 
}

值得注意的是:这里没什么值得好注意的。page_size、page_num是在data中定义的。
此时表格的数据集就得换成page_book_list了
<tr v-for="(book, key) in page_book_list"> 

页码

要渲染页码列表,必须先得到总页数,因为后期可能会增加关键字过滤,所以我们使用计算属性来得到总页数:
不足一页也要当一页来显示

computed : { 
 total_page: function () { 
  let len = this.book_list.length; 
  let ret = parseInt(len/this.page_size); 
  if ((len % this.page_size) != 0) { 
   ret++; 
  } 
  return ret < 1 ? 1 : ret;; 
 } 
}

页码列表的渲染使用v-for即可,参照bootstrap的页码html,不难写出:

<ul class="pagination"> 
 <li :class="{disabled:page_num<=1}" @click="prePage()"> 
  <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><i>«</i></a></li> 
 <li v-for="n in total_page" :class="{active:page_num==n}"> 
  <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" v-text="n" @click="page_num=n"></a></li> 
 <li :class="{disabled:page_num >= total_page}" @click="nextPage()"> 
  <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><i>»</i></a> 
 </li> 
</ul>

值得注意的是:

@click是绑定click事件,可以是函数执行,也可是是js代码执行
:class是绑定class属性,格式是"样式名称: 条件",当条件为true时,才设置这个样式。
此处为何不用v-show?因为效果太难看了

自定义页容量

这就很简单了,将页码下拉框改造一下即可,不难写出:

<select class="form-control" v-model="page_size"> 
 <option 
  v-for = "size in [5,10,15,20]" 
  :value = "size" 
  v-text = "size+'条'"> 
 </option> 
</select>

:value是绑定value的值
v-model会使得select的value与page_size绑定,这个绑定双向的

这里会出现一个小bug,即在切换页容量的时候,会导致总页数变化,有可能总页数会小于当前页。
于是在获取总页数的时候需要对当前页做一些变动:

total_page: function () { 
 let len = this.book_list.length; 
 let ret = parseInt(len/this.page_size); 
 if ((len % this.page_size) != 0) { 
  ret++; 
 } 
 if (this.page_num > ret) { 
  this.page_num = ret; 
 } else if (this.page_num < 1) { 
  this.page_num = 1; 
 } 
 return ret < 1 ? 1 : ret;; 
}

本次效果图:

Vue.js仿Metronic高级表格(二)数据渲染

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

Javascript 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
caller和callee的区别介绍及演示结果
Mar 10 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
想用好React的你必须要知道的一些事情
Jul 24 Javascript
node.js-v6新版安装具体步骤(分享)
Sep 06 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
JavaScript实现前端分页控件
Apr 19 #Javascript
vue动态生成dom并且自动绑定事件
Apr 19 #Javascript
Vue响应式原理详解
Apr 18 #Javascript
详解vue-router基本使用
Apr 18 #Javascript
Vue键盘事件用法总结
Apr 18 #Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 #Javascript
jQuery加密密码到cookie的实现代码
Apr 18 #jQuery
You might like
PHP批量生成缩略图的代码
2008/07/19 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
常用的js方法合集
2017/03/10 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
vue cli安装使用less的教程详解
2019/07/12 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
python中的多线程实例教程
2014/08/27 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python3获取当前目录的实现方法
2019/07/29 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
python 字符串格式化的示例
2020/09/21 Python
python实现自动打卡的示例代码
2020/10/10 Python
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
分层教学实施方案
2014/03/19 职场文书
招股说明书范本
2014/05/06 职场文书
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
Hive常用日期格式转换语法
2022/06/25 数据库