这篇文章的知识点是父子组件通讯,如果你了解 props
, 但是还没了解过 $attrs
,那么建议你花1分钟时间阅读,了解它的优点,并学会在项目中使用。
关于$attrs的介绍
包含了父作用域中不作为 prop
被识别 (且获取) 的特性绑定 (class
和 style
除外)。当一个组件没有声明任何 prop
时,这里会包含所有父作用域的绑定 (class
和 style
除外),并且可以通过 v-bind="$attrs"
传入内部组件——在创建高级别的组件时非常有用。来自官网
意思就是:$attrs
可以收集父组件中的所有传过来的属性除了那些在组件中没有通过 props
定义的。
学会使用$attrs
首先我们有三个组件A-B-C,然后想A中的属性传入C中,基本的做法是这样的,一层一层通过 props
往下传递
<div id="app">
A{{msg}}
<component-b :msg="msg"></component-b>
</div>
复制代码
<script>
let vm = new Vue({
el: '#app',
data: {
msg: '100'
},
components: {
'ComponentB': {
props: ['msg'],
template: `<div>B<component-c :msg="msg"></component-c></div>`,
components: {
'ComponentC': {
props: ['msg'],
template: '<div>C{{msg}}</div>'
}
}
},
}
})
</script>
复制代码
ComponentB
组件中并没有使用到父组件传递过来的属性 msg
,但是这样写就是想把属性再传递给ComponentC
,那么除了这种写法还可以给ComponentC
绑定$attrs
属性。
<script>
let vm = new Vue({
el: '#app',
data: {
msg: '100'
},
components: {
'ComponentB': {
template: `<div>B<component-c v-bind="$attrs"></component-c></div>`,
components: {
'ComponentC': {
props: ['msg'],
template: '<div>C{{msg}}</div>'
}
}
},
}
})
</script>
复制代码
$attrs
可以很方便的做到属性透传,使用起来也比较简单,避免了多写 props
的痛苦。面试的时候也经常会问到父子组件通讯的方式有哪些,那么 props
和 $attrs
都是可以的。