美文网首页
vue 新增属性 $attrs及$listeners (组件通信

vue 新增属性 $attrs及$listeners (组件通信

作者: Fanny | 来源:发表于2020-01-14 14:56 被阅读0次

介绍:vue组件之间的通信方式有很多种,props/emit , event bus, vuex, provide/inject等,还有一种通信方式就是 $attrs$listeners,下面通过一个三代组件的关系来看一下这两个属性

通信.png

$attrs

包含了父作用域中不作为prop识别的特性绑定(除了classstyle ),如果没有声明prop ,就会包含父作用域所有的绑定,传入内部组件

简而言之就是 接收除了props声明外的所有绑定属性(class , style 除外)

//一级 ------------------------------------------------------------------------------------------------------------
<div class="details">
      <h1>父组件---{{msg}}</h1>
      <myComponent :name="msg" age="12" gender="man" ></myComponent>
</div>

//二级 ------------------------------------------------------------------------------------------------------------
<--  <div :name="msg" age="12" gender="man" class="child">  -->
<div class="child">
    <h2>子组件----{{$attrs.name}}</h2>
    <Son v-bind="$attrs"/>
</div>

 created () {
    window.console.log(this.$attrs); //{name: "小白", age: "12", gender: "man"}
 } ,
//如果组件内部显示的声明了props , 那么$attrs 中就只包含除了声明的props之外的属性{age: "12", gender: "man"}
//props: ["name"],

//三级 ------------------------------------------------------------------------------------------------------------
 <div class="son">
      <h3>孙组件---{{$attrs.age}}</h3>
 </div>

created () {
    window.console.log(this.$attrs); //{name: "小白", age: "12", gender: "man"}
 } ,

$listeners

官网解释 : 包含了父作用域中v-on事件监听器(不包含 .native修饰器的),可以通过v-on=$listeners 传入内部组件,在创建更高层次的组件时很有用
个人理解 :父作用域中的事件(除了 .native之外)可以传入到内部组件(可以是一级 , 二级 ,,,多级),使内部组件的数据传递到父级组件更加方便

//一级 ------------------------------------------------------------------------------------------------------------
<div class="details">
      <h1>父组件---{{msg}}</h1>
      <myComponent @name="getname" @age="getage" @gender="getgender" ></myComponent>
 </div>

methods: {
    getname(e){
      window.console.log("name",e) // name 小编
    },
    getage(){
      window.console.log("age")
    },
    getgender(){
      window.console.log("gender")
  }
//二级 ------------------------------------------------------------------------------------------------------------
<div class="child">
    <Son v-on="$listeners"/>
</div>

 created () {
    window.console.log(this.$listeners) // {name: ƒ, age: ƒ, gender: ƒ} 
  } ,      

//三级 ------------------------------------------------------------------------------------------------------------
<div class="son">
    <h3 v-on="$listeners"></h3>
    <button @click="toname">点击</button>
</div>      
    
 data() {
    return {
      name: "小编"
    };
  },
 created() {
    window.console.log(this.$listeners);
  },
  methods: {
    toname() {
      this.$listeners.name(this.name);
    }
  }           

案例
将element ui 的分页器封装成一个组件,使用的$attrs$listeners是原本是第三方组件的属性和事件可以在自己封装的组件中使用,(可以参考官网的element ui 分页器对比属性和事件的写法)

//组件
 <Pagenation
      v-if="list && list.length > 0"
      class="pagenation"
      :total="total"
      :page-size="pagesize"
      @current-change="onPageChange"
      :current-page.sync="currentPage"
    />

//element 组件
 <el-pagination 
  layout="prev, pager, next" 
  v-bind="$attrs" 
  v-on="$listeners">
  </el-pagination>

相关文章

网友评论

      本文标题:vue 新增属性 $attrs及$listeners (组件通信

      本文链接:https://www.haomeiwen.com/subject/pkhaactx.html