通信组件之provide 与 inject实现兄弟组件通信

简介: vue3 | 通信组件之provide 与 inject实现兄弟组件通信

一、vue3 | 通信组件之provide 与 inject实现兄弟组件通信

 通过共同祖先组件使用provide 与 inject来提供和注入状态,从而实现兄弟组件通信的示例。例子:祖先组件提供了一个名为 sharedState 的响应式状态,并通过 provide 函数将其提供给所有子组件。ChildA 和 ChildB 通过 inject 函数接收这个状态,并可以在需要时更新或显示它。代码如下:


二、共同的祖先组件

<script lang="ts" setup>

// 兄弟组件通信

import ChildA from '@/components/ChildA.vue'

import ChildB from '@/components/ChildB.vue'

import { provide ,reactive} from 'vue'

//提供了一个名为 SharedSate 的响应式状态

const SharedSate = reactive({

  message:'Change'

})

// 提供状态给子组件

provide('SharedSate',SharedSate)

</script>

三、子组件

ChildA.vue(子组件一)

<template>

   兄弟组件的组件A:{{ SharedSate1.message }}

   <button @click="updateMess">修改组件A</button>

</template>

<script lang="ts" setup>

import { inject } from 'vue'

// 注入共享状态  

const SharedSate1 = inject<{ message: string }>('SharedSate')

// 更新消息的方法  

const updateMess = () => {

   if (SharedSate1) {

       SharedSate1.message = 'Updated by ChildA';

   }

}

</script>

ChildB.vue(子组件二)

<template>

   兄弟组件的组件B:{{ SharedSate.message }}

   <button @click="updateMess">修改组件B</button>

</template>

<script lang="ts" setup>

import { inject } from 'vue'

// 注入共享状态  

const SharedSate = inject<{ message: string }>('SharedSate');

// 更新消息的方法  

function updateMess() {

   if (SharedSate) {

       SharedSate.message = 'Updated by ChildB';

   }

}

</script>

四、实际应用场景

用户认证状态:在导航栏、侧边栏和主内容区域的用户登录或注销状态

主题或布局偏好:更改网站的主题(如深色模式/浅色模式)或布局(如单列/双列布局)

五、结个尾

       注意,在 TypeScript 中使用 inject 时,你需要为注入的状态提供一个类型注解,以确保类型安全。如果多个组件之间共享大量状态,或者这些状态之间的依赖关系变得复杂,那么考虑使用 Vuex 或其他全局状态管理库可能是一个更好的选择。

目录
相关文章
|
11月前
|
API
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
2372 0
|
Web App开发
成功解决Chrome浏览器 控制台下看不到接口信息的问题
这篇文章提供了解决Chrome浏览器控制台不显示接口信息问题的方法,包括检查过滤设置和确保“保留日志”开关已打开。
成功解决Chrome浏览器 控制台下看不到接口信息的问题
bug:The following dependencies are imported but could not be resolved lib-flexibleflexible
bug:The following dependencies are imported but could not be resolved lib-flexibleflexible
1429 0
|
JavaScript 测试技术 API
如何从 Vue 2 无痛升级到 Vue 3,一文搞定!
如何从 Vue 2 无痛升级到 Vue 3,一文搞定!
|
11月前
cesium自带的组件显示与隐藏
这篇文章讲解了如何控制Cesium中自带组件的显示与隐藏,包括了各个组件的属性名称及其对应的显示隐藏操作方法。
392 0
cesium自带的组件显示与隐藏
|
11月前
|
移动开发 小程序 JavaScript
uni-app多端应用开发:常见跨端兼容问题及处理策略
uni-app多端应用开发:常见跨端兼容问题及处理策略
738 0
|
前端开发 JavaScript
axios拦截器封装:await遇上reject时catch的优雅处理方式
前端项目中使用 axios 请求接口,基于 axios 二次封装了一些业务逻辑,一般我们会在请求和响应拦截器里添加自己项目相关的业务逻辑
|
druid
druid连接池_工具类
druid连接池_工具类
319 2
|
JavaScript API
vue3父子组件相互调用方法详解
vue3父子组件相互调用方法详解
|
JavaScript
js中for of遍历数组获取index的方法
js中for of遍历数组获取index的方法
505 0