provide/inject提供了一种新的组件间通信的方法。它允许父组件向子孙组件间进行跨层级的数据分发,但是provide/inject是非响应式的。一般用于子组件调用父组件的共有方法。它们两个需要一起使用,允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
实例如下:
Test.vue:
<template>
<div class="about">
<h1>我是父组件:{{msg}}</h1>
<button @click="changeMsg">点位改变</button>
<test2></test2>
</div>
</template>
<script>
import test2 from "./Test2";
export default {
name: "Test",
data() {
return {
msg: "你好啊"
};
},
//给子组件传递数据和方法
provide() {
return {
msg: this.msg,
messageBox: this.messageBox
};
},
components: {
test2
},
methods: {
changeMsg() {
this.msg = "今天天气转暖";
},
messageBox(msg){
alert(msg)
}
}
};
</script>
<style>
</style>
Test2.vue:
<template>
<div><h3>我是子组件</h3>{{msg}}
<button @click="message">我要执行父组件的方法</button>
</div>
</template>
<script>
export default {
name:'Test2',
//接收父组件的数据
inject:['msg','messageBox'],
methods:{
message(){
this.messageBox('我是子组件')
}
}
}
</script>
<style>
</style>
当点击父组件中的按钮时,父组件中的msg已经改变,但是子组件中接收的数据并未发生变化。这就说明这种方式共享数据不是响应式的,一般不使用这种方式传递数据。
当点击子组件中的按钮时,会执行父组件的messageBox方法,是推荐的用法。