1、v-bind="attrs"的作用:
2、比如这里有父组件、子组件、孙子组件三级
3、父组件将a,b,c,d,e五个属性通过属性绑定的方式传给子组件,
子组件里面可以不用props来接收,而使用 this.$attrs[属性名]来
使用父组件的属性,在子组件里面的孙子组件身上写v-bind="attrs",
在孙子组件里面就可以通过this.$attrs[属性名]来使用父组件的属性;
如果子组件在props里面接收了来自父组件绑定的属性,那么孙子组件的this.$attrs里
面就没有这几个属性,只剩下父组件里面且子组件没有用props接收的属性。如果孙子组件
想要有这几个属性,就需要在子组件的孙子组件身上通过属性绑定来再次绑定这几个属性。
另外,父组件里面没有被子组件通过props接收的属性会体现为普通属性的方式被绑定在孙子
组件的根元素身上,那假设孙子组件的根元素是一个input标签,且其type属性为number,
如果剩下来的几个属性里面就有type属性,比如为type=text,那么孙子组件身上原来的type
属性就会被覆盖掉,这就改变了数据类型,出现不符合预期的行为。如果孙子组件不想被属
性覆盖,那么可以在孙子组件里面props同级的位置加上inheritAttrs: false,这样孙子组件照样
可以接收来自父组件的type属性,又不用担心属性被覆盖的问题(inheritAttrs: false,
和v-bind="attrs"的作用有点相反的意味)。
1、v-on="$listeners"的作用:
2、比如这里有父组件、子组件、孙子组件三级
3、和 v-bind="attrs" 作用类似,后者是针对属性,前者是针对事件。前者没有弯弯绕绕,
很直接。比如父组件里面在子组件身上绑定自定义事件add,
1、在子组件里面可以通过this.$emit('add')触发,也可以通过this.$listeners.add()来触发;
2、在子组件上加上v-on="$listeners",在孙子组件里面就可以用this.$listeners.add()
来触发。