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>

四、实际应用场景

  1. 用户认证状态:在导航栏、侧边栏和主内容区域的用户登录或注销状态
  2. 主题或布局偏好:更改网站的主题(如深色模式/浅色模式)或布局(如单列/双列布局)

五、结个尾

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

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,兄弟组件之间传递参数可以通过使用事件总线来实现。你可以创建一个事件总线实例,然后在兄弟组件中使用该实例来进行事件的触发和监听。 首先,你需要创建一个事件总线实例。你可以使用类似于上面引用\[1\]中的代码来创建一个事件总线类,该类具有`emit`和`on`方法来触发和监听事件。 然后,在兄弟组件中,你可以通过导入事件总线实例来进行事件的触发和监听。例如,你可以在一个组件中使用`emit`方法来触发一个事件,并在另一个组件中使用`on`方法来监听该事件。 具体来说,你可以在一个组件中使用`emit`方法来触发一个事件,例如: ```javascript import EventBus from 'path/to/event-bus' // ... EventBus.emit('eventName', eventData) ``` 然后,在另一个组件中使用`on`方法来监听该事件,例如: ```javascript import EventBus from 'path/to/event-bus' // ... EventBus.on('eventName', (eventData) => { // 处理事件数据 }) ``` 通过这种方式,你可以在兄弟组件之间传递参数并实现通信。你可以根据需要在不同的组件中触发和监听不同的事件,并传递相应的参数。 请注意,上述代码中的`path/to/event-bus`应该替换为你实际使用的事件总线的路径。另外,你也可以根据需要自定义事件名称和参数。 #### 引用[.reference_title] - *1* *3* [Vue3兄弟组件传参](https://blog.csdn.net/Wu_whiteHyacinth/article/details/127556655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Vue3兄弟组件传值](https://blog.csdn.net/2302_76329106/article/details/129940578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值