vue中的$attrs 与 $listeners 的用法
vue中的 $attrs 与 $listeners ,主要是作为一个中间层,承接组件外部与内部的属性与方法。
示例:
// child.vue
1 <template lang="pug"> 2 .child-page 3 .text 展示code:{{code}} 4 el-button(v-bind="$attrs" v-on="$listeners") 5 slot 6 </template> 7 <script> 8 export default { 9 props: ["code"] //单独领出来放在props里的属性可以通过this[key]获取,否则如果这个code不放在props,那this.code是获取不到的,都会被传入到$attrs里去 10 }; 11 </script>
// parent.vue
1 <template lang="pug"> 2 child(type="primary" size="small" @click="dian" code="btnCode") 点击 3 </template> 4 <script> 5 import child from "./child" 6 export default { 7 components:{child}, 8 methods: { 9 dian() { 10 console.log("点击了"); 11 } 12 } 13 }; 14 </script>
展示效果:
如果不使用$attrts 与 $listeners,那么会增加很多的代码量,代码不够优美简约,示例如下:
// child.vue
1 <template lang="pug"> 2 .child-page 3 .text 展示code:{{code}} 4 // 麻烦1 :要把props都列出来传给按钮; 麻烦2:还得把对应的事件emit出去 5 el-button(:disabled="disabled" :size="size" :type="type" @click="()=>{this.$emit('click')}") 6 slot 7 </template> 8 <script> 9 export default { 10 props: ["code", "disabled", "size", "type"] //麻烦3:要列出一些列按钮需要的props,非常麻烦 11 }; 12 </script>
parent.vue没有改动
总结:$attrs 与 $listeners ,主要是作为一个中间层,承接组件外部与内部的属性与方法。将外部传送的props都通过
v-bind="$attrs"传给内部的组件;将外部执行的事件,通过v-on="$listeners"传给内部的组件。
在使用 $attrs 需要注意一下,如果自身组件也需要使用这个属性,如上述例子中的code,那么需要在props中把code这个属性拎出来,不然都用$attrs传到下面组件的话,自身this.code是获取不到值的。