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

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.dtcms.com/a/303258.html

相关文章:

  • Spark SQL 聚合函数:collect_list 与 collect_set 用法详解
  • ADAS测试:如何用自动化手段提升VV效率
  • 04动手学深度学习(下)
  • AOP实现接口幂等
  • B树、B+树、红黑树区别
  • Solidity基础(教程④-ERC-4626收益金库)
  • 被困扰的elementplus样式修改问题:select选择器修改和el-input修改
  • PHP企业级应用架构:微服务通信、分布式事务与性能优化
  • 短剧系统开发上线全流程攻略:从架构设计到性能优化
  • 页面性能优化
  • SpringBoot轻松集成豆包AI
  • Cacti RCE漏洞复现
  • Android Studio关于Connection refused: connect报错
  • “车位到车位”自动驾驶真相
  • pcm,msd调制解调仿真
  • WCF服务通信框架
  • 用友NC漏洞批量检测工具,支持POC显示、单一检测、批量检测、结果导出、AI交互等
  • Parasoft Virtualize用服务虚拟化加速银行系统的软件测试
  • Red Hat OpenShift AI 产品简介
  • XCF32PVOG48C Xilinx Platform Flash PROM
  • 神经网络CNN、RNN、Transform
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Docker 部署 Supabase并连接
  • 【Linux】重生之从零开始学习运维之Mysql
  • 深度学习篇---层与层之间搭配
  • 基于Qlearning强化学习的水下无人航行器路径规划与避障系统matlab性能仿真
  • 免费离线翻译软件LibreTranslate免安装一键启动整合包下载
  • JavaScript 回调函数讲解_callback
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • 波形发生器AWG硬件设计方案