基于Vue如何封装分页组件


Posted in Javascript onDecember 16, 2016

使用Vue做双向绑定的时候,可能经常会用到分页功能

接下来我们来封装一个分页组件

先定义样式文件 pagination.css

ul, li {
  margin: 0px;
  padding: 0px;
}
.page-bar {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
.page-button-disabled {
  color:#ddd !important;
}
.page-bar li {
  list-style: none;
  display: inline-block;
}
.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;
}

js文件 pagination.js

(function (vue) {
  // html模板信息
  var template = '<div class="page-bar"> \
           <ul> \
            <li><a class="{{ setButtonClass(0) }}" v-on:click="prvePage(cur)">上一页</a></li> \
            <li v-for="index in indexs" v-bind:class="{ active: cur == index }"> \
             <a v-on:click="btnClick(index)">{{ index < 1 ? "..." : index }}</a> \
            </li> \
            <li><a class="{{ setButtonClass(1) }}" v-on:click="nextPage(cur)">下一页</a></li> \
           </ul> \
          </div>'
  var pagination = vue.extend({
    template: template,
    props: ['cur', 'all'],
    computed: {
      indexs: function () {
        var left = 1
        var right = this.all
        var ar = []
        if (this.all >= 11) {
          if (this.cur > 5 && this.cur < this.all - 4) {
            left = this.cur - 5
            right = this.cur + 4
          } else {
            if (this.cur <= 5) {
              left = 1
              right = 10
            } else {
              right = this.all
              left = this.all - 9
            }
          }
        }
        while (left <= right) {
          ar.push(left)
          left++
        }
        if (ar[0] > 1) {
          ar[0] = 1;
          ar[1] = -1;
        }
        if (ar[ar.length - 1] < this.all) {
          ar[ar.length - 1] = this.all;
          ar[ar.length - 2] = 0;
        }
        return ar
      }
    },
    methods: {
      // 页码点击事件
      btnClick: function (data) {
        if (data < 1) return;
        if (data != this.cur) {
          this.cur = data
          this.$dispatch('btn-click', data)
        }
      },
      // 下一页
      nextPage: function (data) {
        if (this.cur >= this.all) return;
        this.btnClick(this.cur + 1);
      },
      // 上一页
      prvePage: function (data) {
        if (this.cur <= 1) return;
        this.btnClick(this.cur - 1);
      },
      // 设置按钮禁用样式
      setButtonClass: function (isNextButton) {
        if (isNextButton) {
          return this.cur >= this.all ? "page-button-disabled" : ""
        }
        else {
          return this.cur <= 1 ? "page-button-disabled" : ""
        }
      }
    }
  })
  vue.Pagination = pagination
})(Vue)

pagination分页组件就封装好了,需要使用的时候,引入以上两个文件即可

接下来我们测试下效果

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <title></title>
  <script src="vue.js"></script>
  <link href="pagination.css" rel="stylesheet" />
  <script src="pagination.js"></script>
</head>
<body>
  <div id="app">
    <vue-pagination :cur.sync="cur" :all.sync="all" v-on:btn-click="listen"></vue-pagination>
    <p>{{msg}}</p>
  </div>
  <script type="text/javascript">
    var app = new Vue({
      el: '#app',
      data: {
        // 当前页码
        cur: 1,
        // 总页数
        all: 100,
        msg: ''
      },
      components: {
        // 引用组件
        'vue-pagination': Vue.Pagination
      },
      methods: {
        listen: function (data) {
          // 翻页会触发此事件
          this.msg = '当前页码:' + data
        }
      }
    })
  </script>
</body>
</html>

最终效果

基于Vue如何封装分页组件

页码切换事件在listen中处理即可

点击此处下载源码:源码下载地址

以上所述是小编给大家介绍的基于Vue如何封装分页组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ajax 文件上传应用简单实现
Mar 03 Javascript
select 控制网页内容隐藏于显示的实现代码
May 25 Javascript
超轻量级的基于jquery的三级展开列表
Apr 26 Javascript
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
javascript中apply和call方法的作用及区别说明
Feb 14 Javascript
js实现局部页面打印预览原理及示例代码
Jul 03 Javascript
jquery实现的Banner广告收缩效果代码
Sep 02 Javascript
原生ajax处理json格式数据的实例代码
Dec 25 Javascript
详解js中==与===的区别
Jan 08 Javascript
微信小程序实现团购或秒杀批量倒计时
Nov 01 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
通过实例了解JS执行上下文运行原理
Jun 17 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 #Javascript
详解如何较好的使用js
Dec 16 #Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 #Javascript
详解js的事件处理函数和动态创建html标记方法
Dec 16 #Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
Dec 16 #Javascript
JS限制条件补全问题实例分析
Dec 16 #Javascript
Node.js用readline模块实现输入输出
Dec 16 #Javascript
You might like
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
js 匿名调用实现代码
2009/06/19 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
原生JS轮播图插件
2017/02/09 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
解决python 上传图片限制格式问题
2019/10/30 Python
python中upper是做什么用的
2020/07/20 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
土木建筑学生自我评价
2014/01/14 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
Golang 遍历二叉树
2022/04/19 Golang