Vue组件间通信方式都有哪些?

2023-11-16

一、组件间通信的概念

组件间通信这个词进行拆分

  • 组件
  • 通信

都知道组件是vue最强大的功能之一,vue中每一个.vue可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,任何信息的交通都是通信组件间通信即指组件(.vue)通过某种方式来传递信息以达到某个目的举个例子在使用UI框架中的table组件,可能会往table组件中传入某些数据,这个本质就形成了组件之间的通信

二、组件间通信解决了什么

在古代,人们通过驿站、飞鸽传书、烽火报警、符号、语言、眼神、触碰等方式进行信息传递,到了今天,随着科技水平的飞速发展,通信基本完全利用有线或无线电完成,相继出现了有线电话、固定电话、无线电话、手机、互联网甚至视频电话等各种通信方式从上面这段话,可以看到通信的本质是信息同步,共享回到vue中,每个组件之间的都有独自的作用域,组件间的数据是无法共享的但实际开发工作中常常需要让组件之间共享数据,这也是组件通信的目的要让它们互相之间能进行通讯,这样才能构成一个有机的完整系统

二、组件间通信的分类

组件间通信的分类可以分成以下

  • 父子组件之间的通信
  • 兄弟组件之间的通信
  • 祖孙与后代组件之间的通信
  • 非关系组件间之间的通信

关系图:

三、组件间通信的方案

整理vue中8种常规的通信方案

  1. 通过 props 传递
  2. 通过 $emit 触发自定义事件
  3. 使用 ref
  4. EventBus
  5. $parent 或$root
  6. attrs 与 listeners
  7. Provide 与 Inject
  8. Vuex

props传递数据

  • 适用场景:父组件传递数据给子组件
  • 子组件设置props属性,定义接收父组件传递过来的参数
  • 父组件在使用子组件标签中通过字面量来传递值

Children.vue

props:{  
    // 字符串形式  
 name:String // 接收的类型参数  
    // 对象形式  
    age:{    
        type:Number, // 接收的类型为数值  
        defaule:18,  // 默认值为18  
       require:true // age属性必须传递  
    }  
}  

Father.vue组件

<Children name="jack" age=18 />  

$emit 触发自定义事件

  • 适用场景:子组件传递数据给父组件
  • 子组件通过$emit触发自定义事件,$emit第二个参数为传递的数值
  • 父组件绑定监听器获取到子组件传递过来的参数

Chilfen.vue

this.$emit('add', good)

Father.vue

<Children @add="cartAdd($event)" />

ref

  • 父组件在使用子组件的时候设置ref
  • 父组件通过设置子组件ref来获取数据

父组件

<Children ref="foo" />  
  
this.$refs.foo  // 获取子组件实例,通过子组件实例我们就能拿到对应的数据  

EventBus

  • 使用场景:兄弟组件传值
  • 创建一个中央时间总线EventBus
  • 兄弟组件通过$emit触发自定义事件,$emit第二个参数为传递的数值
  • 另一个兄弟组件通过$on监听自定义事件

Bus.js

// 创建一个中央时间总线类  
class Bus {  
  constructor() {  
    this.callbacks = {};   // 存放事件的名字  
  }  
  $on(name, fn) {  
    this.callbacks[name] = this.callbacks[name] || [];  
    this.callbacks[name].push(fn);  
  }  
  $emit(name, args) {  
    if (this.callbacks[name]) {  
      this.callbacks[name].forEach((cb) => cb(args));  
    }  
  }  
}  
  
// main.js  
Vue.prototype.$bus = new Bus() // 将$bus挂载到vue实例的原型上  
// 另一种方式  
Vue.prototype.$bus = new Vue() // Vue已经实现了Bus的功能  

Children1.vue

this.$bus.$emit('foo')

Children2.vue

this.$bus.$on('foo', this.handle)

$parent 或$ root

  • 通过共同祖辈$parent或者$root搭建通信侨联

兄弟组件

this.$parent.on('add',this.add)

另一个兄弟组件

this.$parent.emit('add')

$attrs 与$ listeners

  • 适用场景:祖先传递数据给子孙
  • 设置批量向下传属性$attrs和 $listeners
  • 包含了父级作用域中不作为 prop 被识别 (且获取) 的特性绑定 ( class 和 style 除外)。
  • 可以通过 v-bind="$attrs" 传⼊内部组件
// child:并未在props中声明foo  
<p>{{$attrs.foo}}</p>  
  
// parent  
<HelloWorld foo="foo"/>  
// 给Grandson隔代传值,communication/index.vue  
<Child2 msg="lalala" @some-event="onSomeEvent"></Child2>  
  
// Child2做展开  
<Grandson v-bind="$attrs" v-on="$listeners"></Grandson>  
  
// Grandson使⽤  
<div @click="$emit('some-event', 'msg from grandson')">  
{{msg}}  
</div>  

provide 与 inject

  • 在祖先组件定义provide属性,返回传递的值
  • 在后代组件通过inject接收组件传递过来的值

祖先组件

provide(){  
    return {  
        foo:'foo'  
    }  
}  

后代组件

inject:['foo'] // 获取到祖先组件传递过来的值

vuex

  • 适用场景: 复杂关系的组件数据传递

  • Vuex作用相当于一个用来存储共享变量的容器 

  • state用来存放共享变量的地方

  • getter,可以增加一个getter派生状态,(相当于store中的计算属性),用来获得共享变量的值

  • mutations用来存放修改state的方法。

  • actions也是用来存放修改state的方法,不过action是在mutations的基础上进行。常用来做一些异步操作

小结

  • 父子关系的组件数据传递选择 props  与 $emit进行传递,也可选择ref
  • 兄弟关系的组件数据传递可选择$bus,其次可以选择$parent进行传递
  • 祖先与后代组件数据传递可选择attrslisteners或者 Provide与 Inject
  • 复杂关系的组件数据传递可以通过vuex存放共享的变量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue组件间通信方式都有哪些? 的相关文章

  • 更改样式表 JavaScript

    我得到了这个 HTML 代码
  • 如何使用 lodash、underscore 或 bluebird 同步迭代数组 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个数组 其中每个索引处包含文件名 我想下载这些文件一次一个 同步 我知道关于 Async 模块 但我想知道是否有任何功能Lodash
  • 使用Javascript自动打开弹出新窗口[重复]

    这个问题在这里已经有答案了 如何使用Javascript加载页面时打开弹出新窗口 我希望 当网站加载时 它会自动打开弹出新窗口 我使用以下内容 不行 尝试这个
  • Javascript 函数指针,以参数作为函数中的参数

    不确定标题的措辞是否正确 或者是否有更好的表达方式 但我认为还可以 无论如何 到目前为止我了解以下内容 a b a b c foo 其中 foo 是在其他地方定义的函数 不接受任何参数 只会导致函数 a b 使用上述参数运行 然后可以在函数
  • 在设置后用 Javascript 替换 'var' css 属性

    我有一个元素 其上设置了 var 属性 如下所示 div class divwithbackground div CSS divwithbackground after background image var page header se
  • Sequelize 关联 - 请改用 Promise 风格

    我正在尝试将 3 张桌子连接在一起Products Suppliers and Categories然后排SupplierID 13 我读过了如何在sequelize中实现多对多关联 https stackoverflow com a 25
  • 如何使用 JavaScript 上传文件而不进行回发?

    我正在 ASP NET 中进行文件上传 我用了
  • 当key未知时如何获取js对象中的属性值

    我有一个对象数组 a 81 25 p 81 25 81 26 p 81 26 我想循环遍历数组并获取值p在每个元素中 for var key in a console log a key outputs 81 25 Object How d
  • Jquery:排除元素

    我有以下代码 document ready function a rel each function this qtip content text img class middle src i icon processing gif alt
  • 如何使用 JavaScript 压缩文件?

    有没有办法使用 JavaScript 来压缩文件 例如 在雅虎邮件中 当您选择下载电子邮件中的所有附件时 它会被压缩并下载到单个 zip 文件中 JavaScript 能够做到这一点吗 如果是这样 请提供一个编码示例 我发现这个图书馆叫js
  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • 如何格式化折线图谷歌图表材料上的轴?

    我在格式化材料图表的轴时遇到问题 Using classic line chart if I would like to format my vertical axis with a dollar sign I would do vAxes
  • 如何将 vue3-openlayers 插件添加到 nuxt

    我有以下 main ts 文件Vue3 https v3 vuejs org import createApp from vue import App from App vue How to do this in nuxt3 import
  • 如何在没有 jQuery 或延迟加载的情况下推迟背景图像

    根据帕特里克 塞克斯顿tutorial https varvy com pagespeed defer images html 我想以与这里相同的方式推迟背景图像img img src data image png base64 R0lGO
  • 如何使用 ReactJS 使表中的列可以以两种方式排序

    我正在 ReactJS 中构建一个简单的应用程序 它通过调用某个 API 来使用 JSON 数组 然后我将数组的结果填充到表中 我现在想让表的列可排序 我理想的情况是同时进行升序和降序排序 一旦我单击标题 当它按升序排序时 它应该按降序排序
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • 反转比例函数

    这对我来说很有趣 看下面的D3代码 var scale d3 scale linear domain 100 500 range 10 350 scale 100 Returns 10 scale 300 Returns 180 scale
  • 如何从 Visual Studio Code API 打开浏览器

    我只是在探索一种从用于开发扩展的 Visual Studio Code API 打开默认浏览器的方法 以下是我的代码 var disposable vscode commands registerCommand extension brow
  • 如何加载Jquery Tiny滚动条

    所以我想自定义一个滚动条 我发现了一个很小的滚动条 这是一个jquery插件 http baijs nl tinyscrollbar http baijs nl tinyscrollbar 问题是 无论如何我都无法让它工作 我将 Jquer
  • 数组长度未定义[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图按如

随机推荐

  • 单片机程序中遇到的错误和警告小结

    warning C316 unterminated conditionals 头文件中条件编译或预编译错误 注意 ifndef和 endif的对应即可 还有一种警告情况是定义的参数没有用到 很多都忘记了 先贴这么多吧
  • MYSQL--架构--MGR--理论--02--架构

    MYSQL 架构 MGR 理论 02 架构 1 架构图 1 1 主要组成 APIs接口层 组件层 复制协议模块层 GCS API Paxos 引擎层 1 2 事务进入 MGR 层内部处理过程 应用发来的事务从 MySQL Server 经过
  • QT笔记-生成PDF文件(附带完整源码)绘制表格和文字

    项目链接 https download csdn net download C panpan 88268845 https download csdn net download C panpan 88268845 h public void
  • Ubuntu配置apt-get install自动补全功能

    1 执行以下命令 sudo apt get update sudo apt get upgrade 2 默认会安装bash completion 如果没有安装 请执行以下命令 sudo apt get install bash comple
  • JAVA实现文件的上传和下载

    目录 一 文件的上传和下载的作用 什么是文件上传 文件的下载及需求 为什么使用文件上传 二 文件上传 文件上传的关键 不同的框架提供了不同的获取输入流的方式 Servlet上传案例 文件上传细节 存储位置 文件上传问题 目录分离 三 文件下
  • 前端react框架的部分总结

    前端react框架的部分总结 react的优势 react相对其他框架优势 高性能高效率 实现了前端界面的高性能高效率开发 所以说react很擅长处理组件化的页面 和vue的区别 在React中 一切都是JavaScript 所有的组件的渲
  • Android APP应用启动页白屏(StartingWindow)优化

    转自 https www cnblogs com whycxb p 9312914 html 本人采用这种方法没有效果 启动图片出来第一帧 我应用的第一帧也出来了 启动背景颜色没有调试出来 Theme AppCompat Light Dar
  • Java基础-一些容易被人忽视却重要的Java基础知识(二)

    文章目录 一 重载和重写 1 重载 2 重写 一 重载和重写 1 重载 被重载的方法必须改变参数列表 参数个数或者类型 顺序不一样 被重载的方法可以改变返回类型 被重载的方法可以改变访问修饰符 可以使用新的或更广的检查异常 方法能够在同一类
  • java动态生成pdf文件的方法

    java动态生成pdf文件 文章目录 java动态生成pdf文件 前言 一 生成pdf模板 二 使用步骤 1 使用jar包 2 pdf实现方法 总结 前言 java开发过程中难免会遇到生成文件的需求 这里简单介绍一下关于pdf格式的文件的动
  • python常见的面试题,看你都掌握了吗

    前言 Python是目前编程领域最受欢迎的语言 在本文中 我将总结Python面试中最常见的50个问题 每道题都提供参考答案 希望能够帮助你在2019年求职面试中脱颖而出 找到一份高薪工作 这些面试题涉及Python基础知识 Python编
  • usb转网口转换器经常自动断网

    问题 最近使用一个usb转网口的扩展坞 发现和其它机器通信时 经常会自动断网 原因 和设备的电源管理策略有关 USB设备的 允许计算机自动关闭此设备以节约电源 选项默认是选中的 而网络设备的此选项默认值是未选中 解决办法 打开设备管理器 找
  • MATLAB基本语法详解

    MATLAB基本语法详解 下面内容 变量 M Files 决策 循环容易掌握 命令 数据类型 运算符不需要记住 用了再查 变量 每个MatLab变量可以是数组或者矩阵 最简单的方法指定变量 x 3 定义并初始化 赋值 变量x MATLAB上
  • 搭建redis主从服务 :master_link_status:down 主从无法连接问题汇总

    1 问题描述 主从无法连接问题 2 搭建 https blog csdn net ling811 article details 53637257 https blog csdn net qq 24113267 article detail
  • 双机热备 ip地址_SBC双机热备方案

    概述 随着通信全IP化的进程 现代企业中基于IP的语音 视频 会议 融合通信已广泛应用 同时企业通信也面临着新挑战 包括安全攻击 跨网NAT穿越以及业务稳定运行 高可靠方案尤为重要 因此在组网中部署SBC Session Border Co
  • NPN和PNP三极管原理以及应用电路设计

    一 基本概念与原理 三极管最主要的功能是电流放大 模拟电路 和开关作用 数字电路 常用的三极管有 S9014 S8550等型号 三极管由两个PN结构成 共用的一个电极成为三极管的基极 用字母b表示 其他的两个电极成为集电极 用字母c表示 和
  • 安卓加固基础(二)

    4 反调试 4 1 思路一 一个进程最多只能被一个进程ptrace 本文章主要针对安卓so反调试和最初的加壳方法进行了一下总结 在处于调试状态时 Linux会向 proc pid status写入一些进程状态信息 比如TracerPid字段
  • 【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求

    删除字符串中的子串或者字符以满足题意要求 1234 替换子串得到平衡字符串 680 验证回文串 917 仅仅反转字母 1234 替换子串得到平衡字符串 题目链接 1234 替换子串得到平衡字符串 题目内容 题目中给出了平衡字符串的定义 只有
  • TypeScript 初识笔记

    目录 一 基础静态类型和对象类型 二 类型注解和类型推断 三 元组的使用和类型约束 四 接口 五 类 六 联合类型和类型保护 七 枚举 八 泛型 九 tsconfig json文件 TypeScript 其实就是 JavaScript 的超
  • 教程:在Vivado中指定VSCode作为文本编辑器

    教程 在Vivado中指定VSCode作为文本编辑器 更新历史 20190325 首次发布 20201027 对本文第三步中需要填写的内容做了修改 使得VSCode能够实现光标的自动定位 该修改的做法是 HK Journalist 在评论中
  • Vue组件间通信方式都有哪些?

    一 组件间通信的概念 组件间通信这个词进行拆分 组件 通信 都知道组件是vue最强大的功能之一 vue中每一个 vue可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的 广义上 任何信息的交通都是通信组