vue基础知识十一:Vue组件之间的通信方式都有哪些?

2023-09-16 16:48:08

在这里插入图片描述
一、组件间通信的概念

开始之前,我们把组件间通信这个词进行拆分

  • 组件
  • 通信

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

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

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

三、组件间通信的分类

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

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

关系图:
在这里插入图片描述
四、组件间通信的方案

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

  1. 通过 props 传递
  2. 通过 $emit 触发自定义事件
  3. 使用 ref
  4. EventBus
  5. p a r e n t 或 parent 或 parentroot
  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 触发自定义事件

  • 适用场景:子组件传递数据给父组件
  • 子组件通过 e m i t 触发自定义事件, 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
  • 兄弟组件通过 e m i t 触发自定义事件, emit触发自定义事件, 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. b u s . bus. bus.emit(‘foo’)

Children2.vue

this. b u s . bus. bus.on(‘foo’, this.handle)

p a r e n t 或 parent 或 parent root

  • 通过共同祖辈 p a r e n t 或者 parent或者 parent或者root搭建通信桥连

兄弟组件
this.$parent.on(‘add’,this.add)

另一个兄弟组件
this.$parent.emit(‘add’)

a t t r s 与 attrs 与 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的基础上进行。常用来做一些异步操作
  • modules:用于将store分割成模块,每个模块都拥有自己的state、mutation、action、getters和子模块,以便提高应用程序的可维护性。

小结

  • 父子关系的组件数据传递选择 props 与 $emit进行传递,也可选择ref
  • 兄弟关系的组件数据传递可选择 b u s ,其次可以选择 bus,其次可以选择 bus,其次可以选择parent进行传递
  • 祖先与后代组件数据传递可选择attrs与listeners或者 Provide与 Inject
  • 复杂关系的组件数据传递可以通过vuex存放共享的变量
更多推荐

【技术分享】NetLogon于域内提权漏洞(CVE-2020-1472)

一、漏洞介绍CVE-2020-1472是一个Windows域控中严重的远程权限提升漏洞。攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。该漏洞适用于Win2008及后的所有版本。二、漏洞原理Netlogon使用的AES认证算法

区块链(3):区块链去中心化

1点对点同步区块链的流程流程图如下:流程讲解:(1)连接节点(2)向该节点请求最新区块(3)请求到区块以后,根据返回的最新区块前置hash是否和我本身的区块hash相等,分为两种情况:第一种情况:最新区块前置hash和我本身的区块hash相等并合法有效,则最新区块是新区块,同时添加到我的链中。然后广播到我这个节点连接的

期权交易保证金比例一般是多少?

期权交易是一种非常受欢迎的投资方式之一,它为期权市场带来了更为多样化和灵活化的交易形式。而其中的期权卖方保证金比例是期权交易中的一个重要指标,直接关系到投资者的风险与收益,下文介绍期权交易保证金比例一般是多少?本文来自:期权酱一、期权的交易保证金如何计算?期权交易保证金分为开仓保证金和维持保证金。采用非线性保证金的方式

Spring Authorization Server入门 (十七) Vue项目使用授权码模式对接认证服务

Vue单页面项目使用授权码模式对接流程说明以下流程摘抄自官网在本例中为授权代码流程。授权码流程的步骤如下:客户端通过重定向到授权端点来发起OAuth2请求。如果用户未通过身份验证,授权服务器将重定向到登录页面。身份验证后,用户将再次重定向回授权端点。如果用户未同意所请求的范围并且需要同意,则会显示同意页面。一旦用户同意

Spring中@Component和@Bean的区别

前言Spring是一个流行的Java开发框架,它提供了一种简化应用程序开发的方式。在Spring中,@Component和@Bean是两个常用的注解,用于定义和管理对象的创建和依赖注入。虽然它们都用于创建和管理对象,但有一些关键区别。@Component注解@Component是Spring框架的核心注解之一,它用于标

DevOps:从历史到实践的全面解析

在当今的软件开发领域,DevOps已经成为了一个耳熟能详的词汇。从历史发展的角度来看,DevOps源自敏捷开发和云计算的兴起,是软件开发和运维的必然趋势。本文将详细介绍DevOps的历史发展、相关技术以及实践案例,最后对DevOps的意义和未来发展趋势进行总结。一、DevOps的历史发展DevOps作为一项运动,起源于

Json-Jackson和FastJson

狂神:测试Jackson纯Java解决日期格式化设置ObjectMapperFastJson:知乎:Jackson使用指南1、常见配置方式一:yml配置spring.jackson.date-format指定日期格式,比如yyyy-MM-ddHH:mm:ss,或者具体的格式化类的全限定名spring.jackson.t

从「思想实验」中学习,自监督 AI 模型向科学家看齐

年初ChatGPT爆火,美国《时代周刊》发文揭露其背后的「血汗工厂」,给「AIGC领头羊」耀眼的光环蒙上了一层巨大阴影。据报道,为训练ChatGPT识别有害内容,一群来自肯尼亚、乌干达和印度的外包员工负责给数据库手动标注,他们每天花费9小时鉴别各种攻击性词汇,每小时至多标注2万个单词,收获是1.32-2美元的时薪以及持

基于LiDAR的对象检测中的课程化对象操作

论文标题:CurricularObjectManipulationinLiDAR-basedObjectDetection代码:https://github.com/ZZY816/COM导读本文探讨了LiDAR传感器在自动驾驶等安全关键应用中的3D物体检测任务,并引入了一种创新的训练框架,被称为"curricularo

Qt(day3)

思维导图小练习second.h#ifndefSECOND_H#defineSECOND_H#include<QWidget>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QTimerEvent>#include<QTime>#inclu

U盘提示格式化怎么办?3个方法轻松解决!

“我的u盘已经很久没用了,今天刚把u盘插入电脑就显示需要进行格式化。但是我还有很多重要的文件都保存在里面呢。这可怎么办呀?有什么方法恢复里面的数据吗?”u盘是我们日常生活中常用的移动存储设备之一,但有时可能会遇到一个让人烦恼的问题,那就是当插入U盘时,系统可能会弹出“u盘提示格式化”字样。这种情况可能导致数据丢失,因此

热文推荐