Vue 新增的$attrs与$listeners的详解

inheritAttrs:默认值true,继承所有的父组件属性(除props的特定绑定)作为普通的HTML特性应用在子组件的根元素上,如果你不希望组件的根元素继承特性设置inheritAttrs: false,但是class属性会继承(简单的说,inheritAttrs:true 继承除props之外的所有属性;inheritAttrs:false 只继承class属性

$attrs--继承所有的父组件属性(除了prop传递的属性、class 和 style ),一般用在子组件的子元素上

$listeners--属性,它是一个对象,里面包含了作用在这个组件上的所有监听器,你就可以配合 v-on="$listeners" 将所有的事件监听器指向这个组件的某个特定的子元素。(相当于子组件继承父组件的事件

componentA:

<template>
    <div id="app1">
      <!-- //此处监听了两个事件,可以在B组件或者C组件中直接触发 -->
        <child1 :p-child1="child1" :p-child2="child2" v-on:test1="onTest1"  v-on:test2="onTest2">
        </child1>
    </div>
</template>
<script>
import child1 from './child1.vue';
export default {
    data() {
        return {
          child1:'1',
          child2:2
        };
    },
    components: { child1:child1 },
    methods: {
        onTest1() {
            console.log('test1 running...');
        },
        onTest2() {
            console.log('test2 running');
        }
    }
};
</script>

componentB:

<template>
  <div class="child-1">
    <p>in child1:</p>
    <p>props: {{pChild1}}</p>
    <p>$attrs: {{$attrs}}</p>
    <hr />
    <button @click="changes">子组件1</button>
    <!-- C组件中能直接触发test的原因在于 B组件调用C组件时 使用 v-on 绑定了$listeners 属性 -->
    <!-- 通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的) -->
    <child2 v-bind="$attrs" v-on="$listeners" bb="123"></child2>
  </div>
</template>
<script>
import child2 from "./child2.vue";
export default {
  props: ["pChild1"],
  data() {
    return {

    };
  },
  inheritAttrs: false,
  components: { child2:child2 },
  mounted() {
    // this.$emit("test1");
  },
  methods:{
    changes(){
        this.$emit("test1");
    }
  }
};
</script>

componentC: 

<template>
  <div class="child-2">
    <p>in child2:</p>
    <p>props: {{pChild2}}</p>
    <p>$attrs: {{$attrs}}</p>
    <button @click="changes2">子组件2</button>
    <hr />
  </div>
</template>
<script>
export default {
  props: ["pChild2"],
  data() {
    return {};
  },
  inheritAttrs: false,
  mounted() {
    // this.$emit("test2");
  },
    methods:{
    changes2(){
        this.$emit("test2");
    }
  }
};
</script>

效果图:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值