【vue高频面试题】第 12 题:Vue(尤其 Vue3)中父子组件通信方式有哪些?区别是什么?

第 12 题:Vue(尤其 Vue3)中父子组件通信方式有哪些?区别是什么?

这是 Vue 面试必考题,至少 90% 面试官会问。


🎯 一、标准答案(你在面试里应该先说的)

Vue3 中父子组件通信有 大常用方式:

父 → 子

  1. Props(最常见)
  2. Expose(父通过 ref 调用子方法)

子 → 父

  1. Emit 事件

父 ↔ 子

  1. v-model(语法糖,本质是 props + emit)

跨层级

  1. provide / inject

更大范围

  1. Pinia / Vuex(状态管理)

更底层/特殊情况

  1. EventBus(Vue3 不推荐,但面试会问)

🎯 二、父 → 子通信方式


1️⃣ Props(最常用)

父组件:

ini 复制代码
<Child :msg="text" />

子组件:

scss 复制代码
defineProps({
  msg: String
})

Props 特性:

  • 单向数据流(父 → 子)
  • 子不允许修改 props(会直接报错)
  • 适合传递配置类、静态数据

2️⃣ defineExpose(父组件通过 ref 调用子组件方法)

子组件:

scss 复制代码
const submit = () => { ... }
defineExpose({ submit })

父组件:

ini 复制代码
<Child ref="childRef" />
scss 复制代码
childRef.value.submit()

使用场景:

  • 子组件希望暴露一些内部方法给父组件
  • 提交表单、重置、校验等

🎯 三、子 → 父通信方式


3️⃣ Emit 事件

子组件:

scss 复制代码
const emit = defineEmits(['update'])
emit('update', newValue)

父组件:

ini 复制代码
<Child @update="handleUpdate" />

特点:

  • 单向数据流(子 → 父)
  • 组件解耦,官方推荐方式

🎯 四、父 ↔ 子 双向通信


4️⃣ v-model(语法糖)

父组件:

ini 复制代码
<Child v-model="value" />

子组件:

scss 复制代码
defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])

emit('update:modelValue', 123)

本质只是 props + emit 的语法糖。


🎯 五、跨层级通信

5️⃣ provide / inject

祖先组件:

arduino 复制代码
provide('theme', 'dark')

任意层子组件:

ini 复制代码
const theme = inject('theme')

特点:

  • 多层级,不需要一层一层传 props
  • 常用于配置类、上下文类数据(如表单组件库)

🎯 六、全局状态通信

6️⃣ Pinia(或 Vuex)

适合全局数据:

  • 用户信息
  • 权限状态
  • 全局设置
  • 缓存数据

Pinia 是 Vue3 官方主推状态库。


🎯 七、特殊情况

7️⃣ EventBus(Vue3 不推荐,但要知道)

适合简单的事件广播场景:

javascript 复制代码
import mitt from 'mitt'
export const bus = mitt()

组件 A:

arduino 复制代码
bus.emit('hello', 123)

组件 B:

dart 复制代码
bus.on('hello', val => {})

🔥 六、面试官常见追问(附高能回答)


追问 1:父子通信和 provide/inject 的区别是什么?什么时候用哪个?

你应该这样答:

  • 父子 props/emit:适合直接父子通信,数据清晰可控
  • provide/inject:适合跨层级通信,比如 3、5 层以上
  • provide/inject 数据不是响应式(除非你传 ref 或 reactive)

✔ 高分补充:

provide/inject 更像"依赖注入",在 UI 组件库中用得非常多(Element Plus、Ant Design Vue)。


追问 2:v-model 为什么能实现双向绑定?底层是什么?

标准回答:

v-model 本质是 props(modelValue) + emit(update:modelValue)

就是:

父给子:modelValue

子返父:update:modelValue


追问 3:defineExpose 是什么时候用?和 props/emit 的关系?

答:

  • expose 用来暴露方法给父组件调用

  • 和 props/emit 不一样:

    • props/emit 用于 数据
    • expose 用于 方法、行为

例如表单组件:

scss 复制代码
defineExpose({
  validate,
  reset
})

追问 4:provide 是不是响应式的?如何让它变成响应式?

默认 不是响应式(非常多人不知道!)

必须这样传:

csharp 复制代码
const theme = ref('dark')

provide('theme', theme)

inject 处能响应变化。


追问 5:EventBus 为什么不推荐?

  • 容易造成事件混乱
  • 不易追踪
  • 大项目可维护性差
  • TypeScript 支持差

面试官会觉得你非常专业。


🎯 七、一句话总结(背下来就能面试用)

Vue3 父子通信分:props、emit、v-model、expose,跨层级用 provide/inject,全局用 Pinia,少量事件可用 EventBus。

相关推荐
东东的脑洞4 分钟前
【面试突击八】Spring IOC:Bean 创建流程全解析(从 getBean 到 AOP 代理生成)
java·spring·面试
前端摸鱼匠7 分钟前
Vue 3 的watch监听多个数据源:讲解如何同时监听多个响应式数据的变化
前端·javascript·vue.js·前端框架·ecmascript
文心快码BaiduComate10 分钟前
用Spec给AI Agent立规矩,AI编码告别手忙脚乱
前端·后端·前端框架
东北小狐狸-Hellxz10 分钟前
后端生成的URL中含base64参数值,经tomcat重定向后偶发前端无法解密报错
java·前端·tomcat
在等星星呐23 分钟前
人工智能从0基础到精通
前端·人工智能·python
前端不太难32 分钟前
Navigation State 与页面内存泄漏的隐性关系
前端·ui·react
C+++Python37 分钟前
如何选择合适的锁机制来提高 Java 程序的性能?
java·前端·python
IT_陈寒44 分钟前
JavaScript 性能优化:7 个 V8 引擎偏爱的编码模式让你提速 40%
前端·人工智能·后端
小oo呆1 小时前
【自然语言处理与大模型】LangChainV1.0入门指南:核心组件Messages
前端·javascript·easyui
踏浪无痕1 小时前
AOP 的真相:注解只是声明,代理才是执行
spring·面试·架构