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 相关文章推荐
背景图跟随鼠标移动的Mootools插件实现代码
Dec 12 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
Jun 27 Javascript
html超链接打开窗口大小的方法
Mar 05 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
js Array操作的最简短最容易理解方法
Dec 09 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
JavaScript_object基础入门(必看篇)
Jun 13 Javascript
js实现省市级联效果分享
Aug 10 Javascript
jQuery实现简单弹幕效果
Nov 28 jQuery
实例讲解React 组件生命周期
Jul 08 Javascript
js实现限定范围拖拽的示例
Oct 26 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类常量的使用详解
2013/06/08 PHP
CI框架中zip类应用示例
2014/06/17 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
全面理解Python中self的用法
2016/06/04 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python实现代码统计程序
2019/09/19 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Django缓存Cache使用详解
2020/11/30 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
HTML5探秘:用requestAnimationFrame优化Web动画
2018/06/03 HTML / CSS
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
销售人员获奖感言
2014/02/05 职场文书
小学班主任评语
2014/12/29 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
班级班风口号大全
2015/12/25 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
把77A收信机改造成收音机
2022/04/05 无线电
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技