当前位置:实例文章 » HTML/CSS实例» [文章]vue3使用provide&inject实现祖孙组件通讯

vue3使用provide&inject实现祖孙组件通讯

发布人:shili8 发布时间:2024-11-15 17:06 阅读次数:0

**Vue3 中的 Provide & Inject 实现祖孙组件通讯**

在 Vue2.x 中,通过 `$root` 或者 `$parent` 来访问父组件或根组件是很常见的做法。但是在 Vue3 中,这种方式已经被弃用了。相反,我们可以使用 `provide` 和 `inject` 这两个新特性来实现祖孙组件之间的通讯。

### Provide`provide` 是一个用于向下传递数据的函数,它接受一个对象作为参数,返回一个包含该对象的上下文。这意味着在父组件中,我们可以使用 `provide` 来向子组件传递数据。

javascript// 父组件<template>
 <div>
 <!-- 子组件 -->
 <Child />
 </div>
</template>

<script>
import Child from './Child.vue'

export default {
 components: { Child },
 setup() {
 const data = ref('Hello, world!')

 // 使用 provide 向子组件传递数据 return {
 data,
 provide: {
 msg: data,
 },
 }
 },
}
</script>


在上面的例子中,我们使用 `provide` 来向子组件传递一个名为 `msg` 的属性,其值是 `data`。

### Inject`inject` 是用于从父组件中获取数据的函数,它接受一个字符串作为参数,返回该字符串对应的值。我们可以在子组件中使用 `inject` 来获取父组件传递过来的数据。

javascript// 子组件<template>
 <div>
 {{ msg }}
 </div>
</template>

<script>
export default {
 setup() {
 // 使用 inject 从父组件获取数据 const msg = inject('msg')

 return {
 msg,
 }
 },
}
</script>


在上面的例子中,我们使用 `inject` 来从父组件中获取一个名为 `msg` 的属性,其值是 `data`。

### 实现祖孙组件通讯现在我们已经了解了 `provide` 和 `inject` 的基本用法,我们可以通过以下步骤来实现祖孙组件之间的通讯:

1. 在祖父组件中使用 `provide` 来向子组件传递数据。
2. 在子组件中使用 `inject` 来从祖父组件获取数据。
3. 在孙子组件中使用 `inject` 来从子组件获取数据。

javascript// 祖父组件<template>
 <div>
 <!-- 子组件 -->
 <Child />
 </div>
</template>

<script>
import Child from './Child.vue'

export default {
 components: { Child },
 setup() {
 const data = ref('Hello, world!')

 // 使用 provide 向子组件传递数据 return {
 data,
 provide: {
 msg: data,
 },
 }
 },
}
</script>


javascript// 子组件<template>
 <div>
 <!-- 孙子组件 -->
 <GrandChild />
 </div>
</template>

<script>
import GrandChild from './GrandChild.vue'

export default {
 components: { GrandChild },
 setup() {
 // 使用 inject 从祖父组件获取数据 const msg = inject('msg')

 return {
 msg,
 provide: {
 childMsg: msg,
 },
 }
 },
}
</script>


javascript// 孙子组件<template>
 <div>
 {{ childMsg }}
 </div>
</template>

<script>
export default {
 setup() {
 // 使用 inject 从子组件获取数据 const childMsg = inject('childMsg')

 return {
 childMsg,
 }
 },
}
</script>


在上面的例子中,我们实现了祖孙组件之间的通讯。祖父组件向子组件传递了一个名为 `msg` 的属性,其值是 `data`。子组件向孙子组件传递了一个名为 `childMsg` 的属性,其值是 `msg`。孙子组件从子组件中获取了一个名为 `childMsg` 的属性,其值是 `data`。

### 总结在本文中,我们学习了 Vue3 中的 `provide` 和 `inject` 这两个新特性,通过这些特性我们可以实现祖孙组件之间的通讯。我们通过实例代码来演示了如何使用 `provide` 和 `inject` 来传递数据,并且在子组件中使用 `inject` 来从父组件获取数据。在孙子组件中,我们使用 `inject` 来从子组件获取数据,实现了祖孙组件之间的通讯。

其他信息

其他资源

Top