inject
和provide
需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
以上是官方文档的定义,其实inject
和provide
是一种组件传参方式,它有自己独特的使用场景,当子组件调用父组件的data
或者methods
时,通过$parent
这个API
获取到,父子组件两级的情况下可以这么做,如果组件层级非常深,组件层级有N级的话,那就$parent.$parent.....
,代码会非常累赘,所以才有了inject
和provide
。
需要注意的是:inject
和provide
绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。
provide
provide
是父级组件需要传递给子孙组件的属性/方法。选项有以下几种:
- 一个对象。
- 返回一个对象的函数。
//选项一
provide: {
content: 'hello world'
}
//选项二
provide(){
return {
content: 'hello world'
}
}
inject
inject
是子孙组件用来接收父级组件属性/方法。选项有以下几种:
- 一个字符串数组。
- 一个对象,对象的
key
是本地的绑定名,value
是provide
定义的名字。 - 一个对象,区分上一种方式是为了设置默认值。对象的
key
是本地的绑定名,value
也是一个对象。该对象有两个键,一个是from
(provide
定义的名字),另一个是default
(默认值)。
//选项一
inject: ['content']
//选项二
inject: {
content: 'content'
}
//选项三
inject: {
content: {
from:'content',
default:'hello world'
}
}
完整示例
父级组件
<script>
import Son from "@/components/Son.vue";
export default {
name: "Parent",
components: { Son },
provide() {
return {
foo: this.foo,
content: this.content
}
},
data() {
return {
content: 'hello world'
}
},
methods: {
foo() {
console.log("我是父组件")
}
}
};
</script>
子孙组件
<script>
export default {
name: "Son",
inject: ['content','foo'],
created() {
this.foo();
}
};
</script>
网友评论