Vue组件通信方式?

一、父子组件通信(最常用)

1. props(父 → 子)

父组件通过 props 向子组件传递数据。

父组件

xml 复制代码
<template>
  <Child :title="msg" />
</template>

<script>
import Child from './Child.vue'

export default {
  components: { Child },
  data() {
    return {
      msg: 'Hello Vue'
    }
  }
}
</script>

子组件

xml 复制代码
<script>
export default {
  props: ['title']
}
</script>

子组件可以直接使用 title


2. $emit(子 → 父)

子组件通过 $emit 触发事件通知父组件。

子组件

xml 复制代码
<template>
  <button @click="send">点击</button>
</template>

<script>
export default {
  methods: {
    send() {
      this.$emit('update', '来自子组件的数据')
    }
  }
}
</script>

父组件

scss 复制代码
<Child @update="getData" />

methods:{
  getData(val){
    console.log(val)
  }
}

二、父子组件通信(高级)

3. ref(父直接调用子)

父组件通过 ref 获取子组件实例。

ini 复制代码
<Child ref="childRef" />
kotlin 复制代码
this.$refs.childRef.childMethod()

适合:

  • 调用子组件方法
  • 获取子组件数据

4. provide / inject(跨层级)

适合 祖先 → 后代组件

祖组件

javascript 复制代码
provide() {
  return {
    theme: 'dark'
  }
}

子孙组件

vbnet 复制代码
inject: ['theme']

三、兄弟组件通信

5. EventBus(Vue2常用)

创建一个事件总线。

javascript 复制代码
// bus.js
import Vue from 'vue'
export default new Vue()

发送

bash 复制代码
bus.$emit('sendMsg', data)

接收

javascript 复制代码
bus.$on('sendMsg', (data)=>{
  console.log(data)
})

⚠️ Vue3 不推荐。


四、全局状态管理

6. Vuex(大型项目)

Vuex 中统一管理状态。

css 复制代码
组件A → commit → store → 组件B

示例:

kotlin 复制代码
this.$store.commit('setUser', data)

读取:

kotlin 复制代码
this.$store.state.user

7. Pinia(Vue3 推荐)

Pinia 是 Vue3 官方推荐状态管理。

ini 复制代码
const store = useUserStore()

store.name = '张三'

任何组件都可以直接使用。


五、插槽通信

8. slot / scoped slot

父组件向子组件传入结构,子组件向父组件返回数据。

xml 复制代码
<Child>
  <template #default="scope">
    {{ scope.data }}
  </template>
</Child>

六、总结(面试高频)

通信方式 场景
props 父 → 子
$emit 子 → 父
ref 父调用子方法
provide/inject 跨层级
EventBus 兄弟组件
Vuex / Pinia 全局状态
slot 组件复用

💡 面试标准回答(简洁版):

Vue组件通信主要有:

  1. props / emit(父子通信)
  2. ref(父调用子)
  3. provide / inject(跨层级)
  4. EventBus(兄弟组件)
  5. Vuex / Pinia(全局状态管理)
  6. slot(插槽通信)
相关推荐
SuniaWang1 小时前
Vue 项目 Docker 多阶段构建部署指南(阿里云)
vue.js·阿里云·docker
庄小焱1 小时前
Vue——Vue基础语法(1)
前端·javascript·vue.js·前端框架
bigorangeqwq1 小时前
灵机一动想看清全球媒体怎么报同一件事,我撸了个新闻分析站
前端
yangyanping201082 小时前
Vue入门到精通六之一个简单的请求HTTP接口
前端·vue.js·http
小圣贤君2 小时前
在 Electron 里造一个「搜书 + 下载」:从 so-novel 到 51mazi 的爬虫实践
前端·人工智能·爬虫·electron·ai写作·小说下载·网文下载
淘源码d2 小时前
基于Spring Boot + Vue的诊所管理系统(源码)全栈开发指南
java·vue.js·spring boot·后端·源码·门诊系统·诊所系统
掘金安东尼2 小时前
⏰前端周刊第 456 期(v2026.3.15)
前端·javascript·面试
还是大剑师兰特2 小时前
Vue3 通用可复用动态插槽组件(终极版)
前端·javascript·vue.js
nibabaoo2 小时前
前端开发攻略---在 Vue 3 项目中使用 vue-i18n 实现国际化多语言
前端·javascript·国际化·i18n·vue3