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

上篇使用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>

其指令含义为:遍历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>

修改后的表格效果如下:

分页展示

分页其实就是只显示原始数据中,索引值在某一个范围内的数据,可以理解为是一种数据的过滤处理.
如果知道了页容量,当前页码,原始数据集,就能计算出当前页要显示哪些数据。
页码从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;;
}

本次效果图:

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

(0)

相关推荐

  • 用v-html解决Vue.js渲染中html标签不被解析的问题

    前言 最近在工作中遇到一个问题,在网页中后台传来的json数据中包含html标签,将该json数据绑定到Vue.js中对象中,对该对象进行for循环,发现数据中的html标签不能被解析,而是当作字符显示出来. 问题如下所示: 解决方法: Vue.js中提供了v-html这个指令来解决这个问题,或者对数据对象使用{{{vm.data}}}三个大括号来包裹对象,就可以正常解析了. 代码改动如下: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家都 学习或者工作能带来一定的帮助,如果有疑问大家

  • Vue.js学习教程之列表渲染详解

    本文主要给大家介绍了关于Vue.js列表渲染的相关资料,分享出来给大家参考学习,下面来看看详细的介绍: v-for 可以使用 v-for 指令基于一个数组渲染一个列表.这个指令使用特殊的语法,形式为item in items,items 是数据数组,item 是当前数组元素的别名: 示例: <ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li>

  • Vue.js实现多条件筛选、搜索、排序及分页的表格功能

    与上篇实践教程一样,在这篇文章中,我将继续从一种常见的功能--表格入手,展示Vue.js中的一些优雅特性.同时也将对filter功能与computed属性进行对比,说明各自的适用场景,也为vue2.0版本中即将删除的部分filter功能做准备. 需求分析 还是先从需求入手,想想实现这样一个功能需要注意什么.大致流程如何.有哪些应用场景. 表格本身是一种非常常用的组件,用于展示一些复杂的数据时表现很好. 当数据比较多时,我们需要提供一些筛选条件,让用户更快列出他们关注的数据. 除了预设的一些筛选条

  • Vue.JS入门教程之列表渲染

    你可以使用 v-repeat 指令来基于 ViewModel 上的对象数组渲染列表.对于数组中的每个对象,该指令将创建一个以该对象作为其 $data 对象的子 Vue 实例.这些子实例继承父实例的数据作用域,因此在重复的模板元素中你既可以访问子实例的属性,也可以访问父实例的属性.此外,你还可以通过 $index 属性来获取当前实例对应的数组索引. <ul id="demo"> <li v-repeat="items" class="ite

  • vue.js实现条件渲染的实例代码

    一.初探条件渲染 vue 的条件渲染,仍旧依赖于指令系统,下面逐个介绍: (1)v-if <div id="app"> <div v-if="c1">c1</div> </div> ...... var app = new Vue({ el: '#app', data: { c1: false } }); 当 c1 为真值的时候,渲染出 v-if 所绑定的元素,否则不渲染出该元素.渲染结果如下: <div id=

  • 学习vue.js条件渲染

    本文实例为大家分享了vue.js中条件渲染的练习代码,供大家参考,具体内容如下 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>条件渲染</title> </head> <body> <!-- v-if 作为判断条件 如果满足则展示它所附着的元素的内容-->

  • vue.js声明式渲染和条件与循环基础知识

    vue.js声明式渲染和条件与循环的具体内容,分享给大家 绑定 DOM 元素文本值 html代码: <div id="app"> {{ message }} </div> JavaScript代码: var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) 运行结果:Hello Vue! 总结:数据和 DOM 已经被关联在一起,当我们改变app.message的数据,所渲染的的DOM元素

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

    上篇使用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:"微

  • Vue.js仿Metronic高级表格(一)静态设计

    Metronic高级表格是Metonic框架中自行实现的表格,其底层是Datatables,本教程将主要使用Vue实现交互部分,使用Bootstrap做样式库,jQuery做部分用户交互(弹窗). 使用到的库:Vue 2.0,Bootstrap3.jQuery2.font-awesome4,均可在CDN下载 需要注意的是,Vue最好使用开发版本 一.需求和原型设计 产品目标是一个图书管理表格,书籍字段:书籍名称.分类.价格.更新时间. 需求: ① 书籍信息的增删改 ② 分页功能,并且能自行选择页

  • Vue.js仿Metronic高级表格(一)静态设计

    Metronic高级表格是Metonic框架中自行实现的表格,其底层是Datatables,本教程将主要使用Vue实现交互部分,使用Bootstrap做样式库,jQuery做部分用户交互(弹窗). 使用到的库:Vue 2.0,Bootstrap3.jQuery2.font-awesome4,均可在CDN下载 需要注意的是,Vue最好使用开发版本 一.需求和原型设计 产品目标是一个图书管理表格,书籍字段:书籍名称.分类.价格.更新时间. 需求: ① 书籍信息的增删改 ② 分页功能,并且能自行选择页

  • Vue.js仿微信聊天窗口展示组件功能

    源码:https://github.com/doterlin/vue-wxChat 演示地址:https://doterlin.github.io/vue-wxChat/ 运行 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build 介绍 支持文本和图片的展示(后续将

  • vue.js中导出Excel表格的案例分析

    有一个项目需求,要求在前端项目中导出Excel表格,经过查找代码,Vue.js确实可以实现,具体实现步骤为: 1.安装依赖 npm install -S file-saver xlsx npm install -D script-loader 2.导入两个JS 下载Blob.js和Export2Excel.js,在src目录下新建Excel文件夹,里面放入Blob.js和Export2Excel.js两个JS文件 3.在main.js引入这两个JS文件 ** import Blob from '

  • Vue.js中的高级面试题及答案

    Vue-loader 是 Webpack 的加载模块,它使我们可以用 Vue 文件格式编写单文件组件. 单文件组件文件有三个部分,(模板.脚本和样式). vue-loader 模块允许 webpack 使用单独的加载模块 (例如 SASS 或 SCSS 加载器) 提取和处理每个人部分.该设置使我们可以使用 Vue 文件无缝编写程序. vue-loader 模块还允许把静态资源视为模块依赖性,并允许使用 webpack 加载器进行处理. 而且还允许还开发过程中进行热重装. 2.prop 如何指定其

  • 基于vue.js仿淘宝收货地址并设置默认地址的案例分析

    这个案例主要是渲染地址列表,然后设置默认地址,与淘宝的收货地址功能一样,具体自行查看自己的淘宝收货地址: 效果图: html结构 <!--the-address--> <div class="the-address"> <div class="adr-tent" id="vue-address"> <table class="adr-table"> <thead class

  • 使用 Vue.js 仿百度搜索框的实例代码

    整理文档,搜刮出一个使用 Vue.js 仿百度搜索框的实例代码,稍微整理精简一下做下分享. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue demo</title> <style type="text/css"> .bg { background: #ccc; } </style> <s

  • 详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用Vue.Js结合Jquery Ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <script src="js/jquery.js"

  • vue.js配合$.post从后台获取数据简单demo分享

    首先导入 <script type="text/javascript" src="/island/stage/js/vue.min.js"></script> html样式: <div id="main-content" class="wrap-container zerogrid"> <article id="news_content" v-for="i

随机推荐