Vue 3 常见的通信方式

在 Vue 3 中,组件通信方式更丰富、语法更现代化,旧的方式也有一些优化或替代。下面是 Vue 3 常见的通信方式,按使用场景来整理:


✅ 一、父子组件通信

1. props(父传子)

复制代码
<!-- 父组件 -->
<Child :msg="msgFromParent" />

<!-- 子组件 -->
defineProps(['msg'])

2. $emit(子传父)

复制代码
<!-- 子组件 -->
const emit = defineEmits(['update'])
emit('update', value)

<!-- 父组件 -->
<Child @update="handleUpdate" />

✅ 二、兄弟组件通信(非父子)

3. 使用第三方事件总线(推荐 mitt

复制代码
npm install mitt

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

// A组件发送
emitter.emit('eventName', data)

// B组件接收
emitter.on('eventName', (data) => { ... })

✅ 三、跨层级通信

4. provide / inject

适合祖先 -> 任意后代组件传值

复制代码
// 父组件
provide('theme', 'dark')

// 子组件
const theme = inject('theme')

✅ 四、全局状态管理(跨组件、跨页面通信)

5. 使用 Pinia(官方推荐,Vuex 5 已转型)

复制代码
npm install pinia

// store/counter.ts
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  actions: { increment() { this.count++ } },
})

// 在组件中
const counter = useCounterStore()
counter.increment()

✅ 五、ref & expose(父调子组件的方法)

6. ref + defineExpose

复制代码
<!-- 子组件 -->
<script setup>
function sayHello() { console.log('hello') }
defineExpose({ sayHello })
</script>

<!-- 父组件 -->
<Child ref="childRef" />
<script setup>
const childRef = ref()
onMounted(() => {
  childRef.value.sayHello()
})
</script>

✅ 六、路由参数传值

7. 使用 vue-routerparamsquery

复制代码
// 传值
router.push({ name: 'User', params: { id: 123 } })
router.push({ path: '/user', query: { id: 123 } })

// 接收
const route = useRoute()
console.log(route.params.id)
console.log(route.query.id)

✅ 七、LocalStorage / SessionStorage(跨页面通信)

虽然不是组件通信的正统方式,但用于跨页保留状态还是常见:

复制代码
localStorage.setItem('token', 'xxx')
const token = localStorage.getItem('token')
相关推荐
Jackson__10 小时前
为了拯救我的腰椎和颈椎,我做了款浏览器插件!
前端·javascript·开源
林小帅11 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
Hilaku12 小时前
为什么你的大文件断点续传,一遇到弱网就崩溃?
前端·javascript·程序员
林恒smileZAZ13 小时前
`Array(100).map(() => 1)` 为什么全为空?
前端·javascript
濮水大叔14 小时前
在大型 Vue 项目中,如何有效管理复杂的状态?“散装版” vs “套装版”
前端·vue.js·typescript
laowang35716 小时前
依赖故障时,日志体系需要埋哪些关键节点才能快速定位是安装失败、解析失败还是运行时缺失?
前端·javascript·vue.js·webpack·node.js
༄沐࿆风࿆࿆17 小时前
JavaScript函数完全指南:从基础语法到闭包原理与应用实战
开发语言·javascript
finyouIT18 小时前
锚点实现了点击导航平滑滚动到页面指定位置的三种方法
javascript·css
神奇的代码在哪里20 小时前
AI编程时代,PPT已成为过去,单个HTML文件创造无限可能
javascript·html·powerpoint·ai编程·ppt
Highcharts20 小时前
从 ECharts 平滑迁移 Highcharts的配置映射与踩坑手册
前端·javascript