基于Vue.js的表格分页组件


Posted in Javascript onMay 22, 2016

一、Vue.js简介

1、Vue的主要特点: (1) 简洁 (2) 轻量 (3)快速 (4) 数据驱动 (5) 模块友好 (6) 组件化

(1) 简洁

下面看一段Angular的实现双向绑定的代码

// html
<body ng-app="myApp">
 <div ng-controller="myCtrl">
 <p>{{ note }}</p>
 <input type="text" ng-model="note">
 </div>
</body>

// js
var myModule = angular.module('myApp', []);

myModule.controller('myCtrl', ['$scopp', function($scope) {
 $scope.note = '';
]);

然后再看一下Vue的代码:

// html
<body>
 <div id="app">
 <p>{{ note }}</p>
 <input type="text" v-model="note">
 </div>
</body>

// js
var vm = new Vue({
 el: '#app',
 data: {
 note: ''
 }
})

相比较而言我个人认为Vue的代码编写风格更加简洁,并且通俗易懂。

(2)不失优雅

Vue虽然是一个比较轻量级的框架,简单轻量的同时还非常的人性化,其提供的API也是非常的容易理解,同时也提供了一些很便捷的指令和属性。

例如:

1)、绑定click事件

<a v-on:click="doSomething"></a>

可以简写为:

<a @click="doSomething"></a>

2)、 绑定动态属性

<a v-bind:href="url"></a>

可以简写为:

<a :href="url"></a>

3)、便捷的修饰符

<!-- 阻止单击事件冒泡 -->
<a @click.stop="doSomething"></a>

<!-- 只在按下回车键的时候触发事件 -->
<input @keyup.enter="submit">

4)、实用的参数特性

<!-- debounce 设置一个最小的延时 -->
<input v-model="note" debounce="500">

<!-- 在 "change" 而不是 "input" 事件中更新数据 -->
<input v-model="msg" lazy>

怎么样,是不是感觉优雅极了。

(3)小巧

说起小巧,那应该首先要关注下Vue的源码大小,Vue的成产版本(即min版)源码仅为72.9kb,官网称gzip压缩后只有25.11kb,相比Angular的144kb缩小了一半。

小巧的一种好处就是可以让用户更自由的选择相应的解决方案,在配合其他库方面它给了用户更大的空间。

如Vue的核心默认是不包含路由和 Ajax 功能,但是如果项目中需要路由和AJAX,可以直接使用Vue提供的官方库Vue-router及第三方插件vue-resource,同时你也可以使用其他你想要使用的库或插件,如jQuery的AJAX等。

是不是感觉非常的灵活。

(4)不乏大匠

Vue虽然小巧,但是“麻雀虽小五脏俱全”,在构建大型应用的时候也是得心应手。

1)、模块化

结合一些第三方模块构建工具,如CommonJS、RequireJS或者SeaJs,可以轻松实现代码的模块化。

但是在这里小编不推荐使用上述构建工具,直接使用ES6的模块化功能,再结合Webpack进行相应打包是目前最热门的方案。

不了解ES6模块功能的可以详见:链接地址

在今后的文章中,我也会对其进行介绍,包括Webpack的配置。

2)、组件化

Vue的组件化功能可谓是它的一大亮点,通过将页面上某一组件的html、CSS、js代码放入一个.vue的文件中进行管理可以大大提高代码的维护性。

例如:

// App.vue
<template>
 <div class="box" v-text="note"></div>
</template>

<script>
export default {
 data () {
 return {
 note: '这是一个组件的html模板!'
 }
 }
}
</script>

<style scoped>
.box {
 color: #000;
}
</style>

我们还可以在组件里写一些预处理语言:

// App.vue
<template lang='jade'>
 div(class="box" v-text="text")
</template>

<script>
export default {
 data () {
 return {
 note: '这是一个组件的html模板!'
 }
 }
}
</script>

<style lang="stylus">
.box 
 color: #000
</style>

当然这样写我们是需要通过webpack来进行打包的,推荐使用Webpack + vue-loader的方式,同时使用ES6语法,需要安装babel来进行转换。因为文章为浅谈Vue.js,所以这里不做深入介绍。

3)、路由

和Angular一样,Vue也具有它的路由功能。通过路由功能,我们可以实现各个组件的按需加载,轻松构建单页应用。下面是一个简单的路由配置文件:

// router.js

'use strict'

export default function(router) {
 router.map({
 '/': {
 component: function (resolve) {
 require(['./components/Foo.vue'], resolve)
 }
 },
 '/foo': {
 component: function (resolve) {
 require(['./components/Foo.vue'], resolve)
 }
 },
 '/bar': {
 component: function (resolve) {
 require(['./components/Bar.vue'], resolve)
 }
 }
 })
}

二、BootPage组件简介

其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件库里分页组件都功能太强大或者没有适合我的,所以就自己写了一个凑合着用,或许有人和我一样需要这样一个简单的分页组件来实现简单的分页功能,我便在这里分享一下,大家自觉填坑咯。

如需高大上的组件,可以移步Vue官方组件库

(1)使用方法

在.vue的组件文件中我们这样写template,即html代码:

<table class="table table-hover table-bordered">
 <thead>
 <tr>
 <th width="10%">id</th>
 <th width="30%">name</th>
 <th width="40%">content</th>
 <th width="20%">remark</th>
 </tr>
 </thead>
 <tbody>
 <tr v-for="data in tableList">
 <td v-text="data.num"></td>
 <td v-text="data.author"></td>
 <td v-text="data.contents"></td>
 <td v-text="data.remark"></td>
 </tr>
 </tbody>
 <tfoot>
 <tr>
 <td colspan="4">
 <div class="col-sm-12 pull-right">
 <boot-page :async="false" :data="lists" :lens="lenArr" :page-len="pageLen"></boot-page>
 </div>
 </td>
 </tr>
 </tfoot>
 </table>

<boot-page>标签中async指是否从服务器端获取数据,false为否;data为静态的为分页的表格数据数组;lens为每页显示行数的数组;page-len为可显示的页码数;

使用静态数据的javascript代码即script标签内的内容如下:

<script>
 import bootPage from './components/BootPage.vue'

 export default {
 data () {
 return {
 lenArr: [10, 50, 100], // 每页显示长度设置
 pageLen: 5, // 可显示的分页数
 lists: [
 {num: 1, author: 'luozh', contents: '123', remark: 'bootPage'},
 {num: 1, author: 'luozh', contents: '123', remark: 'bootPage'},
 {num: 1, author: 'luozh', contents: '123', remark: 'bootPage'},
 {num: 1, author: 'luozh', contents: '123', remark: 'bootPage'},
 {num: 1, author: 'luozh', contents: '123', remark: 'bootPage'},
 {num: 1, author: 'luozh', contents: '123', remark: 'bootPage'}
 ], // 表格原始数据,使用服务器数据时无需使用
 tableList: [] // 分页组件传回的分页后数据
 }
 },
 components: {
 bootPage
 },
 events: {

 // 分页组件传回的表格数据
 'data' (data) {
 this.tableList = data
 }
 }
 }
 </script>

一般我们很少使用静态的表格数据,大多数应用的数据都是从服务器端获取的,所以这里提供了获取服务器分页数据的方法:

使用服务器数据的组件HTML如下:

<boot-page :async="true" :lens="lenArr" :url="url" :page-len="pageLen" :param="param"></boot-page>
 其中url为服务器的请求地址;param为需要向服务器发送的参数对象; 

使用服务器数据javascript的代码如下:

<script>
 import bootPage from './components/BootPage.vue'

 export default {
 data () {
 return {
 lenArr: [10, 50, 100], // 每页显示长度设置
 pageLen: 5, // 可显示的分页数
 url: '/bootpage/', // 请求路径
 param: {}, // 向服务器传递参数
 tableList: [] // 分页组件传回的分页后数据
 }
 },
 methods: {
 refresh () {
 this.$broadcast('refresh') // 这里提供了一个表格刷新功能
 }
 },
 components: {
 bootPage
 },
 events: {

 // 分页组件传回的表格数据(这里即为服务器传回的数据)
 'data' (data) {
 this.tableList = data
 }
 }
 }
</script>

注:服务器除了传给组件表格的数组内容,还需一个总页数的键名,名为page_num

(2)组件源码

至于分页的实现源码这里的就不展示了,所有源码我都上传到了我的github,地址

这里事先提个醒:因为这个组件是我用几个小时赶出来的,所以对于Vue组件的编写格式和规范肯定是考虑不周的,没有完全独立出来,所以自觉填坑咯,这里只作分享。

当然你也可以随意的修改组件的代码来适合自己项目的使用,毕竟实现大而全的分页组件还是比较复杂的。

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

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

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

Javascript 相关文章推荐
javascript 特殊字符串
Feb 25 Javascript
jQuery的Ajax时无响应数据的解决方法
May 25 Javascript
JQuery1.6 使用方法三
Nov 23 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
Apr 25 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
javascript cookie的简单应用
Feb 24 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
js中常用的Tab切换效果(推荐)
Aug 30 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
微信小程序(三):网络请求
Jan 13 Javascript
JS实现的数字格式化功能示例
Feb 10 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 Javascript
js正则表达式replace替换变量方法
May 21 #Javascript
深入解析JavaScript中的立即执行函数
May 21 #Javascript
详解JavaScript中Hash Map映射结构的实现
May 21 #Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 #Javascript
基于javascript实现表格的简单操作
May 21 #Javascript
javascript检测移动设备横竖屏
May 21 #Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 #Javascript
You might like
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
聊天室php&amp;mysql(六)
2006/10/09 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
大学生毕业的自我评价分享
2014/01/02 职场文书
校园招聘策划书
2014/01/09 职场文书
给领导的检讨书
2014/02/16 职场文书
现场活动策划方案
2014/08/22 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
父母教会我观后感
2015/06/17 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Python函数中apply、map、applymap的区别
2021/11/27 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis