当前位置: 首页 > web >正文

Vue3后代传祖先组件通讯方法

在 Vue3 中,后代组件向祖先组件通信可以通过以下几种方式实现:

方式一:Provide/Inject + 函数传递(推荐)

vue

<!-- 祖先组件 -->
<script setup>
import { provide } from 'vue'const handleChildMsg = (msg) => {console.log('收到后代消息:', msg)
}// 提供函数给后代
provide('sendToAncestor', handleChildMsg)
</script><!-- 后代组件 -->
<script setup>
import { inject } from 'vue'// 注入祖先提供的函数
const send = inject('sendToAncestor')const sendMessage = () => {send('来自后代的消息')
}
</script>

方式二:自定义事件总线

javascript

// eventBus.js
import mitt from 'mitt'
export const emitter = mitt()

vue

复制

<!-- 祖先组件 -->
<script setup>
import { onMounted, onUnmounted } from 'vue'
import { emitter } from './eventBus'const handleEvent = (msg) => {console.log('收到消息:', msg)
}onMounted(() => {emitter.on('child-message', handleEvent)
})onUnmounted(() => {emitter.off('child-message', handleEvent)
})
</script><!-- 后代组件 -->
<script setup>
import { emitter } from './eventBus'const emitToAncestor = () => {emitter.emit('child-message', '后代发送的消息')
}
</script>

方式三:Vuex/Pinia 状态管理

javascript

// store.js
import { defineStore } from 'pinia'export const useMainStore = defineStore('main', {state: () => ({messageFromDescendant: null}),actions: {setMessage(msg) {this.messageFromDescendant = msg}}
})

vue

<!-- 祖先组件 -->
<script setup>
import { useMainStore } from './store'
import { watch } from 'vue'const store = useMainStore()watch(() => store.messageFromDescendant,(newVal) => {console.log('收到消息:', newVal)}
)
</script><!-- 后代组件 -->
<script setup>
import { useMainStore } from './store'const store = useMainStore()const sendMessage = () => {store.setMessage('后代发送的消息')
}
</script>

方式四:模板引用(多层组件时)

vue

<!-- 祖先组件 -->
<script setup>
import { ref } from 'vue'const lastChildRef = ref(null)const handleChildMsg = (msg) => {console.log('收到消息:', msg)
}// 通过 expose 暴露方法
defineExpose({ handleChildMsg })
</script><template><ParentComponent><ChildComponent ref="lastChildRef" /></ParentComponent>
</template>

最佳实践选择:

  1. 简单通信:优先使用 provide/inject

  2. 跨组件通信:推荐使用事件总线

  3. 复杂状态管理:使用 Pinia/Vuex

  4. 直接组件引用:模板引用 + expose

注意:provide/inject 需要确保在组件树中存在提供者,事件总线要注意及时移除监听避免内存泄漏,状态管理适用于需要持久化或共享的数据。

http://www.xdnf.cn/news/274.html

相关文章:

  • BGP基础实验
  • DeepSeek-R3、GPT-4o 与 Claude-3.5-Sonnet 全面对比:性能、应用场景与技术解析
  • 【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(网管改造工程)
  • C++数据收发管道:构建高效的数据传输通道
  • 【android bluetooth 案例分析 03】【PTS 测试 1】【pts基本介绍】
  • 空调制冷量和功率有什么关系?
  • 算法题(127):最大子段和
  • QT项目----电子相册(2)
  • 极验4 语序验证码 分析 极验4 w
  • WiFi“管家”------hostapd的工作流程
  • Manus AI:突破多语言手写识别技术壁垒之路
  • element-plus添加暗黑模式
  • AI大模型API文档的核心内容概述,以通用框架和典型实现为例
  • 超导材料的应用领域概述
  • UWP特性分析
  • vs如何快速找到多余的#region
  • 吃透LangChain(五):多模态输入与自定义输出
  • 人工智能学习框架完全指南(2025年更新版)
  • 基于VS Code 为核心平台的python语言智能体开发平台搭建
  • mysql collation_database 参数
  • spring:加载配置类
  • linux如何手动设置域名与 IP 地址的映射关系
  • 深入理解React中的Props与State:核心区别与最佳实践
  • AXOP36061S: 60V 高压单通道运算放大器
  • DemoGen:用于数据高效视觉运动策略学习的合成演示生成
  • PCM 参数深度解析:采样率、帧、缓存大小与多通道关系
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第二模块·语法迁移篇 —— 第六章 函数革命:从过程到方法的重生
  • Yarn的安装及环境配置
  • PS中制作一张扣洞贴图
  • transient关键字深度解析