• 技术文章 >web前端 >js教程

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

    高洛峰高洛峰2017-02-24 17:20:30原创1010

    这篇文章主要介绍了vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法,非常不错,具有参考借鉴价值,,需要的朋友可以参考下

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

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

    var barHtml = '<p 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>'+
      '</p>';
     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代码

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

    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封装了一下分页组件。

    实现效果

    <!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>
    <p id="page">
     <vue-nav :cur.sync="cur" :all.sync="all" v-on:btn-click="listenDate"></vue-nav>
     <p style="margin-left:40px;">{{msg}}</p>
    </p>
    <script type="text/javascript">
     var barHtml = '<p 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>'+
      '</p>';
     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进行事件监听数据传递,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!

    更多vuejs2.0实现分页组件使用$emit进行事件监听数据传递相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:vue2.0 分页组件
    上一篇:最详细的JavaScript和事件解读 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 深入解析JWT(JSON Web Token)的原理及用法• 聊聊Node项目中怎么操作MySQL• 聊聊Node.js中怎么用async函数• 一文聊聊Angular中的依赖注入• react native路由跳转怎么实现
    1/1

    PHP中文网