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

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 需要确保在组件树中存在提供者,事件总线要注意及时移除监听避免内存泄漏,状态管理适用于需要持久化或共享的数据。

相关文章:

  • 04.Spring 框架注解体系详解
  • L2-006 树的遍历
  • Logisim数字逻辑实训——寄存器设计与应用
  • 【datawhaleAI春训营第一期笔记】AI+航空安全
  • openbmb/MiniCPM-V-2_6 和 AIDC-AI/Ovis2-1B 的网络结构体对比
  • 专著出版能为评职助力吗?
  • IPTV电视信息发布直播点播系统:营造数字化个性化融合化多媒体IPTV电视信息发布平台
  • 数据结构学习笔记 :二叉搜索树与高效查找算法详解
  • 认知觉醒是什么? 如何做到 ? ( 持续更新ing )
  • FairMOT算法详解
  • 《软件设计师》复习笔记(12.3)——质量管理、风险管理
  • 《数据牢笼》-来自DeepSeek
  • iPaaS应用集成平台在交通运输行业有哪些应用场景
  • 第一期第16讲,17讲21:50
  • 淘宝商品搜索爬虫:Python 实现教程
  • Animated Raindrop Ripples In HLSL
  • Ext系列⽂件系统
  • C语言---FILE结构体
  • 21【干获】如何用GIS快速统计每种地类面积?
  • 梯度下降代码
  • 经济日报金观平:拥抱中国就是拥抱确定性
  • 海南开展药品安全“清源”行动,严查非法渠道购药等违法行为
  • 管理规模归零,华夏基金“ETF规模一哥”张弘弢清仓卸任所有产品
  • 两大跨国巨头称霸GLP-1市场,国产减肥药的机会在哪?
  • 广西东兰官方通报“村民求雨耕种”:摆拍,恶意炒作
  • 中共中央台办、国务院台办在南京举办台商代表座谈会