1. 介绍Vue的provide和inject概念
在Vue中,provide和inject是用来进行跨级组件通讯的,它们可以让我们在组件树上的任何一个地方,把数据传递给它的后代组件,而无需嵌套层层传递。官方文档描述:provide/inject 主要解决了跨组件之间的依赖注入问题,不需要通过 props 层层传递数据,能够更好地完成一些中高级别的场景实现。
下面,我们就来看看Vue如何使用provide和inject来实现跨级组件通讯。
2. 派生使用方式
provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。这样响应式被“注入”进来的 property 会向父级组件和祖代组件,甚至全局事件似的同步变化。
2.1 provide传递数据
在provide中,我们定义一个数据对象,可以包含各种类型的数据,在下面的例子中,我们定义了一个简单对象,它包含了一个字符串和一个整型数字:
/*定义数据*/
provide() {
return {
message: 'Hello Vue.js',
age: 20
}
}
2.2 inject接收数据
在inject中,我们可以使用一个数组来注入provide中定义的数据,数组的值为提供的key,下面的例子中提供了两个值,message和age。这样,我们就可以在组件中直接使用这些数据了,不需要通过props来传递了。
/*接收数据*/
inject: ['message', 'age']
2.3 示例代码
下面的代码演示了如何在Vue中使用provide和inject进行跨级组件通讯:
父组件:
<template>
<div>
Parent Component
<!-- 提供message和age数据 -->
<component-a :age="age" />
</div>
</template>
<script>
import ComponentA from '@/components/ComponentA.vue'
export default {
components: {
ComponentA,
},
provide() {
return {
message: 'Hello from Parent Component',
age: 20,
}
},
}
</script>
子组件A:
<template>
<div>
Component A
<!-- 注入父组件提供的message数据 -->
<component-b :message="message" />
</div>
</template>
<script>
import ComponentB from '@/components/ComponentB.vue'
export default {
components: {
ComponentB,
},
inject: ['message', 'age'],
}
</script>
子组件B:
<template>
<div>
Component B
<!-- 使用父组件提供的message数据 -->
{{message}}
</div>
</template>
<script>
export default {
inject: ['message', 'age'],
}
</script>
上面代码演示了在父组件中提供了message和age两个数据,然后在子组件A中用inject注入了message和age,子组件B也注入了message和age,这样message数据就传递了两级,可以被子组件B使用。
3. 总结
在Vue中,provide和inject可以让我们轻松实现跨级组件通讯,不需要大量嵌套层层传递数据,提高了组件之间的灵活性和可复用性。我们可以在provide中定义数据并在inject中使用。然而需要注意的是,provide和inject不是响应式的,所以需要特别注意。