$attrs/inheritAttrs可以实现组件的跨级传递
$attrs/inheritAttrs可以实现组件的跨级传递
// 问题1 为什么this.$attrs可以得到主 传递过来的值
//$attrs 说明
// $attrs 可以很方便的做到属性透传,使用起来也比较简单,避免了多写 props 的痛苦。
// 当一个组件没有声明任何prop时候,attrs里面包含着全部的上层组件传递的所有数据(除style和class)
// 当一个组件声明了prop时候,attrs里面包含除去prop里面的数据剩下的数据。
// inheritAttrs
// 1.当在子组件中设置inheritAttrs: false的时候,attrs里面的属性不会当做html的data属性渲染在dom节点之上。
// 2.在子组件中不进行设置inheritAttrs的时候,attrs里面的属性会渲染在html节点之上
// 3.当设置为inheritAttrs: false的时候,在组件的声明周期created中可以通过 this.$attrs 获取里面的上层组件数据。
// 当在子组件中设置inheritAttrs: false的时候,attrs里面的属性是没有style和class的
// $attrs/$listeners可以跨级传递 兄弟之间就不行
// 最大的go组件里面引入go1组件
// go1组件里面有go2组件
// go2里面有go3组件
go.vue
<template>
<div>
我是 go
<go1
:foo="foo"
:boo="boo"
:coo="coo"
:doo="doo"
></go1>
</div>
</template>
<script>
import go1 from "../go1/go1"
export default {
data(){
return{
foo: "Javascript",
boo: "Html",
coo: "CSS",
doo: "Vue"
}
},
components:{
go1
}
}
</script>
go1.vue
<template>
<div>
<h2>-----------------</h2>
<br>
我是go1111
<!-- <p>foo: {{ foo }}</p> -->
<!-- <p>go1得到主组件中的数据$attrs: {{ $attrs }}</p> -->
<go2 v-bind="$attrs"></go2>
<br>
<h2>-----------------</h2>
</div>
</template>
<script>
import go2 from "../go2/go2"
export default {
components:{
go2
},
inheritAttrs: false, // .当设置为inheritAttrs: false的时候,在组件的声明周期中可以通过 this.$attrs 获取里面的上层组件数据。
props: { foo: String // 当声明了prop时候,attrs里面包含除去prop里面的数据剩下的数据。 所以下面没有 Javascript
},
created() {
console.log("我在1出输出",this.$attrs); // {boo: "Html", coo: "CSS", doo: "Vue"}
}
}
</script>
go2.vue
<template>
<div>
<h2>-----------------</h2>
<br>
go222
<p>boo: {{ boo }}</p>
<p>childCom2: {{ $attrs }}</p>
<go3 v-bind="$attrs"></go3>
<br>
<h2>-----------------</h2>
</div>
</template>
<script>
import go3 from "../go3/go3"
export default {
components:{
go3
},
inheritAttrs: false,
props: {
boo: String //当声明了prop时候,attrs里面包含除去prop里面的数据剩下的数据。 所以下面没有 html
},
created() {
console.log("我是组件2",this.$attrs); // 我是组件2 {coo: "CSS", doo: "Vue"}
}
}
</script>
go3.vue
<template>
<div>
<h2>-------</h2>
<br>
go333
<p>childCom3: {{ $attrs }}</p>
<h2>-------</h2>
<br>
</div>
</template>
<script>
export default {
props: {
coo: String, //当声明了prop时候,attrs里面包含除去prop里面的数据剩下的数据。 所以下面没有 coo
},
created() {
console.log("我是组件3",this.$attrs); // 我是组件2 { doo: "Vue"}
}
}
</script>
遇见问题,这是你成长的机会,如果你能够解决,这就是收获。
作者:晚来南风晚相识
出处:https://www.cnblogs.com/IwishIcould/
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
出处:https://www.cnblogs.com/IwishIcould/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
支付宝
微信
如果文中有什么错误,欢迎指出。以免更多的人被误导。