provide / inject使用方式
时间: 2023-09-24 08:05:52 浏览: 135
`provide`和`inject`是Vue.js的依赖注入系统。依赖注入是一种将依赖项传递给一个对象的设计模式,而不是在该对象内部创建它们。
在Vue.js中,`provide`和`inject`一起使用,可以让父组件提供依赖项,并且子组件可以通过`inject`来访问这些依赖项。
下面是一个简单的示例:
```javascript
// 父组件提供依赖项
const ParentComponent = {
provide: {
message: 'Hello from parent'
},
// ...
}
// 子组件使用inject来访问依赖项
const ChildComponent = {
inject: ['message'],
created() {
console.log(this.message) // 'Hello from parent'
},
// ...
}
```
在上面的示例中,父组件`ParentComponent`提供了一个名为`message`的依赖项,它的值是`'Hello from parent'`。子组件`ChildComponent`使用`inject`来访问`message`依赖项,并在`created`钩子函数中打印出了该值。
注意,`provide`和`inject`可以在任何组件中使用,不仅限于父子组件之间的传递。另外,`provide`和`inject`是响应式的,这意味着当提供的值发生变化时,所有使用该值的组件都会得到更新。
相关问题
参考Vue3官方文档,学习使用provide/inject方式实现曹操-曹丕父子、曹操-曹叡祖孙通信。 要求:代码实操provide/inject方式,笔记附上练习代码
在Vue3中,`provide`和`inject`是用于单向数据流中的依赖注入的一种机制,常用于解决组件间的通信问题,特别是当需要从父级传递值给孙子组件时。下面是一个简单的例子,展示了如何通过`provide`和`inject`实现曹操-曹丕父子以及曹操-曹叡祖孙之间的通信。
首先,我们定义一个全局的提供者(provider),通常在根实例或App组件中:
```javascript
// 父组件或App.vue
export default {
setup() {
// 定义全局变量,这里可以理解为“政治权力”
const power = '曹操';
// 使用 provide 提供数据
provide('power', power); // 在setup函数中提供
return {};
},
};
```
然后,儿子曹丕和孙子曹叡可以通过`inject`接收这个值:
```vue
<!-- 子组件曹丕.vue -->
<template>
<div>{{ powerFromFather }}</div>
</template>
<script setup>
import { inject } from 'vue';
// 使用 inject 接收数据
const powerFromFather = inject('power');
</script>
```
```vue
<!-- 孙子组件曹叡.vue -->
<template>
<div>{{ powerFromGrandfather }}</div>
</template>
<script setup>
import { inject } from 'vue';
// 使用 inject 接收更深层次的数据
const powerFromGrandfather = inject('power');
</script>
```
笔记:
1. `provide`是将值暴露出去的行为,而`inject`则是从祖先组件获取已提供的值。
2. 需要注意的是,如果有多层子孙组件需要此数据,都需要单独引入并注入`power`,因为`inject`只能获取直接的祖先提供的值。
3. 这种方式适用于父子、祖父孙等直系血缘关系的组件通信,如果是非直系或复杂结构,则可能需要考虑其他方式,如事件总线(Event Bus)或自定义指令等。
vue3provide/inject使用
Vue3中的`provide`和`inject`是用于组件间数据传递的特性,它们属于单向数据流设计模式的一部分,主要用于解决组件树层级之间依赖的问题。`provide`通常由父组件使用,用来声明共享的数据或服务,而`inject`则在子组件中使用,用于接收这些提供。
1. **Provide**:
- 在父组件中,你可以通过`this.$provide`来创建一个提供项,如`this.$provide['myService'] = { data: 'Hello' }`,这样就创建了一个名为`myService`的服务,并赋予其`data`属性值。
2. **Inject**:
- 子组件可以使用`@inject`装饰器从其父组件或其他提供者那里注入需要的数据,例如`:inject=['myService']`。然后,在组件的setup钩子函数中,你可以通过`this.myService`访问到提供的服务。
举个例子:
```vue
// 父组件 App.vue
<template>
<ChildComponent />
</template>
<script setup>
import ChildComponent from './ChildComponent.vue'
const myService = { message: 'Hi from parent' }
provide('myService', myService)
</script>
```
```vue
// 子组件 ChildComponent.vue
<template>
<div>{{ myMessage }}</div>
</template>
<script setup>
import { inject } from 'vue'
// 注入 'myService'
const myService = inject('myService')
setup() {
// 访问并使用提供的数据
const myMessage = myService.message
}
</script>
```
阅读全文