vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法


Posted in Javascript onFebruary 22, 2017

上一篇文章介绍了vuejs实现的简单分页,如果我有几个页面都需要有分页效果,不可能每个页面都去复制一下这段代码吧,意思是封装一下,变成通用的组件。

首先使用基础 Vue 构造器,创建一个“子类”,Vue.extend( options )

var barHtml = '<div class="page-bar">'+
   '<ul>'+
   '<li v-if="cur>1"><a v-on:click="cur--,pageClick()">上一页</a></li>'+
   '<li v-if="cur==1"><a class="banclick">上一页</a></li>'+
   '<li v-for="index in indexs" v-bind:class="{ active: cur == index}">'+
    '<a v-on:click="btnclick(index)">{{ index }}</a>'+
   '</li>'+
   '<li v-if="cur!=all"><a v-on:click="cur++,pageClick()">下一页</a></li>'+
   '<li v-if="cur == all"><a class="banclick">下一页</a></li>'+
   '<li><a>共<i>{{all}}</i>页</a></li>'+
   '</ul>'+
  '</div>';
 var navBar = Vue.extend({
 template:barHtml,
 props:['all','cur'],
 computed: {
  indexs: function(){
  var left = 1;
  var right = this.all;
  var ar = [];
  if(this.all>= 5){
  if(this.cur > 3 && this.cur < this.all-2){
   left = this.cur - 2
   right = this.cur + 2
  }else{
   if(this.cur<=3){
   left = 1
   right = 5
   }else{
   right = this.all
   left = this.all -4
   }
  }
  }
  while (left <= right){
  ar.push(left)
  left ++
  }
  return ar
  } 
 },
 methods: {
  btnclick: function(data){
  if(data != this.cur){
   this.cur = data;
   this.$emit('btn-click',data); 
  }
  },
  pageClick: function(){
  this.$emit('btn-click',this.cur);
  }
 }, 
 });
 window.pagenav = navBar;

这儿创建了一个全局的pagenav,可以在其它地方都可以调用。

html代码

<div id="page">
 <vue-nav :cur.sync="cur" :all.sync="all" v-on:btn-click="listenDate"></vue-nav>
 <p style="margin-left:40px;">{{msg}}</p>
</div>

css代码

.page-bar{
 margin:40px;
}
ul,li{
 margin: 0px;
 padding: 0px;
}
li{
 list-style: none
}
.page-bar ul{
 overflow: hidden;
}
.page-bar li{
 float: left;
}
.page-bar li:first-child>a {
 margin-left: 0px
}
.page-bar a{
 display: block;
 border: 1px solid #ddd;
 text-decoration: none;
 position: relative;
 padding: 6px 12px;
 margin-left: -1px;
 line-height: 1.42857143;
 color: #337ab7;
 cursor: pointer
}
.page-bar a:hover{
 background-color: #eee;
}
.page-bar a.banclick{
 cursor:not-allowed;
}
.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;
}

新建一个vue对象实例

var pageBar = new Vue({
 el: '#page',
 data: {
  all: 8, //总页数
  cur: 1,//当前页码
  msg:''
 },
 components:{
  'vue-nav':pagenav
 },
 watch: {
  cur: function(oldValue , newValue){
  console.log('监听cur前与后的值:');
  console.log(arguments);
  }
 }, 
 methods:{
  listenDate:function(data){
  this.cur = data;
  this.msg = '你点击了'+data+ '页';
  }
 }
 })

简单的用js封装了一下分页组件。

实现效果

vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta charset="utf-8">
<title></title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="js/vue.min2.js"></script>
<style>
.page-bar{
 margin:40px;
}
ul,li{
 margin: 0px;
 padding: 0px;
}
li{
 list-style: none
}
.page-bar ul{
 overflow: hidden;
}
.page-bar li{
 float: left;
}
.page-bar li:first-child>a {
 margin-left: 0px
}
.page-bar a{
 display: block;
 border: 1px solid #ddd;
 text-decoration: none;
 position: relative;
 padding: 6px 12px;
 margin-left: -1px;
 line-height: 1.42857143;
 color: #337ab7;
 cursor: pointer
}
.page-bar a:hover{
 background-color: #eee;
}
.page-bar a.banclick{
 cursor:not-allowed;
}
.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;
}
</style>
</head>
<body>
<div id="page">
 <vue-nav :cur.sync="cur" :all.sync="all" v-on:btn-click="listenDate"></vue-nav>
 <p style="margin-left:40px;">{{msg}}</p>
</div>
<script type="text/javascript">
 var barHtml = '<div class="page-bar">'+
   '<ul>'+
   '<li v-if="cur>1"><a v-on:click="cur--,pageClick()">上一页</a></li>'+
   '<li v-if="cur==1"><a class="banclick">上一页</a></li>'+
   '<li v-for="index in indexs" v-bind:class="{ active: cur == index}">'+
    '<a v-on:click="btnclick(index)">{{ index }}</a>'+
   '</li>'+
   '<li v-if="cur!=all"><a v-on:click="cur++,pageClick()">下一页</a></li>'+
   '<li v-if="cur == all"><a class="banclick">下一页</a></li>'+
   '<li><a>共<i>{{all}}</i>页</a></li>'+
   '</ul>'+
  '</div>';
 var navBar = Vue.extend({
 template:barHtml,
 props:['all','cur'],
 computed: {
  indexs: function(){
  var left = 1;
  var right = this.all;
  var ar = [];
  if(this.all>= 5){
  if(this.cur > 3 && this.cur < this.all-2){
   left = this.cur - 2
   right = this.cur + 2
  }else{
   if(this.cur<=3){
   left = 1
   right = 5
   }else{
   right = this.all
   left = this.all -4
   }
  }
  }
  while (left <= right){
  ar.push(left)
  left ++
  }
  return ar
  } 
 },
 methods: {
  btnclick: function(data){
  if(data != this.cur){
   this.cur = data;
   this.$emit('btn-click',data); 
  }
  },
  pageClick: function(){
  this.$emit('btn-click',this.cur);
  }
 }, 
 });
 window.pagenav = navBar;
 var pageBar = new Vue({
 el: '#page',
 data: {
  all: 8, //总页数
  cur: 1,//当前页码
  msg:''
 },
 components:{
  'vue-nav':pagenav
 },
 watch: {
  cur: function(oldValue , newValue){
  console.log('监听cur前与后的值:');
  console.log(arguments);
  }
 }, 
 methods:{
  listenDate:function(data){
  this.cur = data;
  this.msg = '你点击了'+data+ '页';
  }
 }
 })
</script>
</body>
</html>

以上所述是小编给大家介绍的vuejs2.0实现分页组件使用$emit进行事件监听数据传递,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
var与Javascript变量隐式声明
Sep 17 Javascript
JSON 编辑器实现代码
Dec 06 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
Sep 30 Javascript
jquery入门必备的基本认识及实例(整理)
Jun 24 Javascript
将字符串中由空格隔开的每个单词首字母大写
Apr 06 Javascript
jquery利用命名空间移除绑定事件的方法
Mar 11 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
JavaScript对象引用与赋值实例详解
Mar 15 Javascript
JS控件bootstrap suggest plugin使用方法详解
Mar 25 Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 Javascript
微信小程序云开发实现增删改查功能
May 17 Javascript
JS实现一个简单的日历
Feb 22 #Javascript
js实现日历与定时器
Feb 22 #Javascript
JS验证字符串功能
Feb 22 #Javascript
Bootstrap3 模态框使用实例
Feb 22 #Javascript
Bootstrap3下拉菜单的实现
Feb 22 #Javascript
微信小程序开发之相册选择和拍照详解及实例代码
Feb 22 #Javascript
js仿微博动态栏功能
Feb 22 #Javascript
You might like
php在线生成ico文件的代码
2007/10/09 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
django model通过字典更新数据实例
2020/04/01 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
python实现简单的聊天小程序
2021/07/07 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android