Vue 组件通信是面试重点,考察对组件间数据传递的掌握,需要分场景说明不同的通信方式,覆盖“父子、祖孙、兄弟、全局”四种场景,回答要全面且有条理。
核心答案要点(按场景分类):
一、父子组件通信(最常用):
父传子:通过
props传递数据,子组件用defineProps接收,props 可以指定类型、默认值、校验规则。
子传父:通过
emit触发事件,子组件用defineEmits定义事件,父组件通过 @事件名 监听,接收子组件传递的数据。
二、祖孙组件通信(跨层级):
provide / inject:祖父组件用 provide 提供数据,子孙组件用 inject 注入数据,无论层级多深都能获取,适合简单的跨层级通信(注意:provide/inject 是非响应式的,如需响应式,可传递 ref/reactive 对象)。
三、兄弟组件通信:
方案1:状态提升,将兄弟组件的共享状态提升到共同的父组件,通过父组件中转(推荐,逻辑清晰)。
方案2:eventBus(事件总线),用 mitt 库创建全局事件总线,实现兄弟组件间的事件触发和监听(适合简单场景)。
四、全局通信(任意组件):
Pinia / Vuex:Vue3 推荐用 Pinia(替代 Vuex),管理全局状态,任意组件都能获取和修改全局状态,适合复杂项目。
补充:还有 ref / defineExpose 方式(父组件通过 ref 获取子组件实例,调用子组件的方法或获取数据),适合父组件直接操作子组件的场景。