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

Vue组件通信的终极指南

Vue 组件通信方式根据组件关系和应用场景可分为多种方案,以下是主要分类及实现方法:


⚙️ 一、父子组件通信

  1. Props(父 → 子)
    父组件通过属性传递数据,子组件用 props 接收。

    <!-- 父组件 -->
    <Child :title="parentData" />
    <!-- 子组件 -->
    <script setup>
    const props = defineProps(['title']);
    </script>
    
  2. **emit/自定义事件(子→父)∗∗子组件通过‘emit / 自定义事件(子 → 父)** 子组件通过 `emit/自定义事件(子父)子组件通过emit` 触发事件,父组件监听处理。

    <!-- 子组件 -->
    <button @click="$emit('update', data)">提交</button>
    <!-- 父组件 -->
    <Child @update="handleUpdate" />
    
  3. ref / $parent / $children

    • ref:父组件通过 ref 访问子组件实例或 DOM。
    • $parent / $children:直接访问父/子实例(Vue3 中 $children 移除)。
    <!-- 父组件 -->
    <Child ref="childRef" />
    <script setup>
    import { ref } from 'vue';
    const childRef = ref();
    childRef.value.childMethod(); // 调用子组件方法
    </script>
    

🔄 二、跨层级组件通信

  1. provide / inject
    祖先组件提供数据,后代组件注入使用。

    <!-- 祖先组件 -->
    <script setup>
    import { provide } from 'vue';
    provide('theme', 'dark');
    </script>
    <!-- 后代组件 -->
    <script setup>
    import { inject } from 'vue';
    const theme = inject('theme');
    </script>
    
  2. $attrs / $listeners

    • $attrs:传递未在 props 中声明的属性(如 class, style)。
    • $listeners:传递事件监听器(Vue3 合并到 $attrs)。
    <!-- 父组件 -->
    <Child :msg="message" @custom-event="handler" />
    <!-- 子组件 -->
    <Grandchild v-bind="$attrs" /> <!-- 继续向下传递 -->
    

🌐 三、任意组件通信

  1. Event Bus(全局事件总线)
    创建 Vue 实例作为事件中心(Vue3 推荐使用 mitt 等库)。

    // eventBus.js(Vue2)
    const bus = new Vue();
    export default bus;
    // 组件A:发送事件
    bus.$emit('message', data);
    // 组件B:监听事件
    bus.$on('message', handler);
    
  2. Vuex / Pinia(状态管理)
    集中式状态管理,适用于中大型项目。

    • Vuex:Vue2 官方状态库。
    • Pinia:Vue3 推荐的状态管理方案,更简洁。
    // Pinia 示例
    import { defineStore } from 'pinia';
    export const useStore = defineStore('main', {state: () => ({ count: 0 }),actions: { increment() { this.count++ } }
    });
    

💎 四、Vue3 新增特性

  1. defineExpose(暴露组件方法)
    通过 <script setup> 显式暴露属性或方法。

    <!-- 子组件 -->
    <script setup>
    const publicMethod = () => {};
    defineExpose({ publicMethod });
    </script>
    
  2. v-model 增强
    支持多个 v-model 绑定及自定义修饰符。

    <!-- 父组件 -->
    <Child v-model:title="pageTitle" v-model:content="pageContent" />
    

📊 通信方式对比与选型建议

通信方式适用场景特点版本支持
Props / $emit父子组件简单数据传递官方基础方案,单向数据流Vue2/3
provide / inject跨多层组件传递数据避免逐层传递,响应式数据支持Vue2/3
Event Bus任意组件事件通信(小型项目)轻量但需注意事件销毁Vue2
Vuex / Pinia复杂状态共享集中管理,支持调试工具Vue2/3
$attrs / $listeners透传属性与事件简化多层组件属性传递Vue2/3

最佳实践:

  • 父子通信首选 Props + $emit
  • 跨层级数据用 provide / inject
  • 全局状态管理用 Pinia(Vue3) 或 Vuex(Vue2)。
  • 避免滥用 $parentref 直接修改数据,保持数据流清晰。
http://www.xdnf.cn/news/16517.html

相关文章:

  • 【数据库】使用Sql Server将分组后指定字段的行数据转为一个字段显示,并且以逗号隔开每个值,收藏不迷路
  • uniapp,uview 报错:Not Found:Page[2][-1;-1,8,0,28] at view.umd.min.js:1
  • 从fork到exit:剖析Linux进程的诞生、消亡机制
  • 阿里云通义灵码深度解析:AI编程时代的技术革命与实践探索
  • 计算机毕设分享-基于SpringBoot的健身房管理系统(开题报告+前后端源码+Lun文+开发文档+数据库设计文档)
  • Windows---动态链接库Dynamic Link Library(.dll)
  • Java AI面试实战:Spring AI与RAG技术落地
  • Rust赋能智能土木工程革新
  • 【LeetCode 热题 100】51. N 皇后——回溯
  • Java面试全方位解析:从基础到AI的技术交锋
  • 【Python系列】使用 memory_profiler 诊断 Flask 应用内存问题
  • 单表查询-or优化
  • K-近邻算法
  • Linux之shell脚本篇(三)
  • 3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
  • rust- 定义模块以控制作用域和隐私
  • 任务提醒工具怎么选?对比16款热门软件
  • 2025年Agent创业实战指南:从0到1打造高增长AI智能体项目
  • 撤销连续三年不使用注册商标一次下受理书!
  • Spring之【Bean的生命周期】
  • Android MQTT 长连接最佳实践技术分享
  • Amazon Relational Database Service (Amazon RDS)入门课
  • C++ 构造函数中阻止资源泄漏的实践探索
  • Linux驱动20 --- FFMPEG视频API
  • 【 Python 】Collections库权威指南
  • 【多模态】天池AFAC赛道四-智能体赋能的金融多模态报告自动化生成part1-数据获取
  • 卫星图像数据集在农业领域的应用
  • Leetcode力扣解题记录--第136题(查找单数)
  • Redis C++客户端——命令使用
  • Vue 框架 学习笔记