Vue 2 组件间的通信方式总结

引言

在这里插入图片描述

组件间的关系有父子关系、兄弟关系、祖孙关系和远亲关系。

不同的关系间,组件的通信有不同的方式。

在这里插入图片描述

一、prop 和 $emit

prop向下传递,emit向上传递。

父组件使用 prop 向子组件传递信息。

在这里插入图片描述

ParentComponent.vue

<template><div><ChildComponent msg="Hello,this is the message passed from the parent component."></ChildComponent><ChildComponent :msg="parentMsg"></ChildComponent></div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';export default {data() {return {parentMsg: 'Hello,this is the message passed from the parent component.'}},components: {ChildComponent}
}
</script>

ChildComponent.vue

<template><div><p>{{ msg }}</p></div>
</template>
<script>
export default {props: {msg: String}
}
</script>

子组件通过实例的事件方法 $emit 向父组件通信

$emit 触发一个自定义事件,并接受一个参数作为抛出值。父组件通过 $event 或回调函数获取传递值。

在这里插入图片描述

ParentComponent.vue

<template><div><p>{{ msg }}</p><!-- <ChildComponent @custom-event="handleCustomEvent"></ChildComponent> --><!-- 或者 --><ChildComponent @custom-event="msg=$event"></ChildComponent></div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';export default {data() {return {msg: '现在为空'}},components: {ChildComponent},methods: {handleCustomEvent(msg) {this.msg = msg;}},
}
</script>

ChildComponent.vue

<template><div><button @click="sendMsgToParent">发送消息到父组件</button></div>
</template>
<script>
export default {data() {return {msg: 'Hello,this is the message passed from child component.'}},methods: {sendMsgToParent() {this.$emit('custom-event', this.msg);}}
}
</script>

优先使用 prop 和 事件进行父子组件间的通信。

二、$parent$children

子实例可以用 this.$parent 访问父实例,同时子实例被推入父实例的 $children 数组中。

ParentComponent.vue

<template><div><h3>父组件</h3><p>来自子组件 1 的消息:{{ msg1 }}</p><p>来自子组件 2 的消息:{{ msg2 }}</p><button @click="receiveMsgFromChildren">接收子组件的消息</button><br><br><button @click="msg1= '现在为空';msg2='现在为空'">清空</button><ChildComponent1 /><ChildComponent2 /></div>
</template>
<script>
import ChildComponent1 from './ChildComponent1.vue';
import ChildComponent2 from './ChildComponent2.vue'export default {data() {return {msg1: '现在为空',msg2: '现在为空'}},components: {ChildComponent1,ChildComponent2},methods: {receiveMsgFromChildren() {this.msg1 = this.$children[0].msg;this.msg2 = this.$children[1].msg;}},
}
</script>

ChildComponent1.vue

<template><div><h3>子组件1</h3><button @click="sendMsgToParent">发送消息给父组件</button></div>
</template>
<script>
export default {data() {return {msg: 'Hello,this is the message passed from child component1.'}},methods: {sendMsgToParent() {this.$parent.msg1 = this.msg;}}
}
</script>

ChildComponent2.vue

<template><div><h3>子组件2</h3><button @click="sendMsgToParent">发送消息给父组件</button></div>
</template>
<script>
export default {data() {return {msg: 'Hello,this is the message passed from child component2.'}},methods: {sendMsgToParent() {this.$parent.msg2 = this.msg;}}
}
</script>

在这里插入图片描述

在这里插入图片描述

三、依赖注入

依赖注入设置两个选项:provideinject

provide 选项允许我们提供一系列数据或方法。然后在设置了 provide 选项的组件的所有后代组件里都可以通过 inject 选项获取这些数据或方法。

provide 选项应该是一个对象或返回一个对象的函数。

provide: {foo: 'bar'
}provide: {return {foo: 'bar'}
}

inject 选项可以为以下值:

  1. 一个字符串数组,其元素值为 provide 属性的 key。
  2. 一个对象,对象的 key 是绑定在本地的,可以与 provide 不同,如果要设置为不同名的属性,那么就要给该属性设置 from 属性来说明它来自哪个 provide 提供的属性,同时你可以为它提供默认值 default
inject: ['foo']inject: {foo: {from: 'bar'default'foo'}
}

四、ref$refs

ref 属性为普通 DOM 元素或子组件指定引用,该引用会被注册到父组件的 $refs 对象上。

<div ref="div"></div><child-component ref="child" />

使用

vm.$refs.divvm.$refs.child

如果你尝试在 createdmounted 钩子中访问 ref,通常会得到 undefined。因为 ref 本身是作为渲染结果被创建的,在初始渲染(beforeUpdate之前)的时候你不能访问它们。

五、事件总线

使用事件总线进行组件间通信的步骤:

1.创建事件总线

// EventBus.js 
import Vue from 'vue'; 
export const EventBus = new Vue();

2.引入事件总线

import { EventBus } from './EventBus.js';

3.在发送组件中触发事件

EventBus.$emit('custom-event',eventData);

4.在接收组件中监听事件

EventBus.$on('custom-event',(data)=>{//处理 data
});

5.移除监听事件

EventBus.$off('custom-event')

六、$attrs$listeners

$attrs包含了父组件传递给子组件的所有没有在子组件 props 中声明的属性(除了classstyle)。当子组件没有声明任何props时,$attrs中会包含所有父组件传递的属性(除了classstyle),这在创建高级别的通用组件时非常有用,因为你无需知道父组件会传递哪些属性。

下面是一个示例来说明$attrs的用法:

假设我们有一个名为MyButton的子组件,它可以接收label属性,但同时也希望允许父组件传递任意额外的HTML属性给按钮元素。我们可以使用$attrs来实现这一点:

<template><button v-bind="$attrs">{{ label }}</button>
</template><script>
export default {props: {label: String,},
};
</script>

在这个示例中,MyButton组件只声明了一个名为label的prop,但它使用v-bind="$attrs"将所有父组件传递的属性绑定到按钮元素上。这意味着,父组件可以像这样使用MyButton

<MyButton label="Click me" class="btn btn-primary" id="my-button" @click.native="handleClick" />

在这里,classid属性会被传递到<button>元素,而label会被解析为"Click me",同时@click事件也会正常工作。

在这里插入图片描述

$listeners 包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

ParentComponent.vue

<template><div><MyButton label="Click me" class="btn btn-primary" id="my-button" @click="handleClick" /></div>
</template><script>
import MyButton from './MyButton.vue'export default {components: {MyButton},methods: {handleClick() {console.log('点击了1次')}}
};
</script>

MyButton.vue

<template><button v-bind="$attrs" v-on="$listeners">{{ label }}</button>
</template><script>
export default {props: {label: String,},
};
</script>

七、Vuex

以后专门学习,在此不做介绍先。

八、浏览器客户端存储

MDN-客户端存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-09-17力扣每日一题

链接&#xff1a; 213. 打家劫舍 II 题意 n个数字围成一圈&#xff0c;禁止取相邻&#xff0c;求能取到的最大值 解&#xff1a; 经典DP特判/一丢丢思维 可以开个bool判断第一个取没取&#xff0c;然后判断最后一个&#xff0c;同样&#xff0c;再倒着做一遍即可 思维&a…

记录Linux部署人脸修复GFPGAN项目Docker Python 使用

记录Linux 服务器使用人脸修复GFPGAN 项目 1:阿里云安装docker,用docker 是隔离环境,Python环境还真是麻烦… https://help.aliyun.com/zh/ecs/use-cases/deploy-and-use-docker-on-alibaba-cloud-linux-2-instances 2:关于docker 镜像,想找个好的镜像也是很难,百度吧,很多Li…

VSCODE 使用技巧

vscode批量去掉代码中空行的方法 1、在vscode中使用ctrl f组合快捷键打开替换窗口. 2、输入下面的正则表达式 ^\s*(?\r?$)\n https://mp.weixin.qq.com/s/ZKV2sZWszxBLNTNLEWhsng 你的代码够安全吗&#xff1f;推荐5个VS Code代码安全插件 VSCode&#xff1a;人生苦短&…

C++项目实战——基于多设计模式下的同步异步日志系统-⑤-实用工具类设计

文章目录 专栏导读获取系统时间time介绍 getTime函数设计判断文件是否存在stat介绍exists函数设计 获取文件所在路径find_last_of介绍path函数设计 创建文件所在目录mkdir介绍find_first_of介绍函数createDirectory设计 实用工具类整理 专栏导读 &#x1f338;作者简介&#xf…

VS code 下 makefile 【缺少分隔符 停下来】 报错解决方法

首先来看报错的makefile源码 再来看报错的信息&#xff1a; 第5行缺少分隔符&#xff0c;其实不止是第5行&#xff0c;只要是前面需要加tab留白的行都会报这个错误&#xff0c;比如说第7行第11行 编译的时候&#xff0c;前面的留白必须是按tab键生成的 但是&#xff01;&…

【JavaSE笔记】抽象类与接口

一、抽象类 1、概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 package demo2…

DM@数理逻辑@命题公式及其赋值@真值表@公式分类

文章目录 abstract命题公式及其赋值命题常项命题变项 命题公式合式公式(命题公式)限定基本联结词的合适公式的定义合式公式中的0和1子公式 **公式的层次定义**分层加括号 命题公式的赋值和解释成真赋值成假赋值公式的书写规范括号的省略 真值表赋值方法数量构造真值表 公式分类…

Json-Jackson和FastJson

狂神&#xff1a; 测试Jackson 纯Java解决日期格式化 设置ObjectMapper FastJson&#xff1a; 知乎&#xff1a;Jackson使用指南 1、常见配置 方式一&#xff1a;yml配置 spring.jackson.date-format指定日期格式&#xff0c;比如yyyy-MM-dd HH:mm:ss&#xff0c;或者具体的…

深入理解Windows句柄

引言 我们首先需要了解在windows内核中&#xff0c;为了方便管理一些相关的数据结构&#xff0c;Windows统一把它们称之为对象。在Windows内核代码中大量代码都是用C语言编写的。而我们知道在C语言中&#xff0c;并没有纯粹的面向对象&#xff0c;也没有类这一说。因此我们可以…

ArmSoM-W3之RK3588 Debian11详解

1. 简介 RK3588从入门到精通Debian 是⼀种完全⾃由开放并⼴泛⽤于各种设备的 Linux 操作系统。Rockchip在官⽅Debian发⾏版的基础上构建和适配了相关硬件功能 2. 环境介绍 硬件环境&#xff1a; ArmSoM-W3 RK3588开发板 软件版本&#xff1a; OS&#xff1a;ArmSoM-W3 Debia…

WPF 如何让xmal的属性换行显示 格式化

WPF 如何让UI的xmal 按照下面的格式化显示 首先格式化显示在VS中的快捷键是 Ctrl &#xff2b;D 然后需要配置&#xff0c;工具 选项 -文本编辑器 -xmal -格式化-间距 更改成如下就可以了

[2023.09.12]: Yew应用开发的第一个hook--use_state

Yew的SSR模式推荐使用function_component组件&#xff0c;并且在function_component中使用hooks。其中&#xff0c;我使用到的第一个hook是use_state。use_state的设计意图与React中的useState非常相似&#xff0c;都是为了保存并修改当前的状态。然而&#xff0c;由于Yew是用R…

RK3588 点亮imx586摄像头

一.硬件原理图 mipi摄像头硬件确认点&#xff1a; 1.供电&#xff1a;5V&#xff0c;2.8V&#xff0c;1.2V&#xff0c;1.8V&#xff0c;reset脚&#xff08;硬拉3.3&#xff0c;上电的时候从低到高&#xff09;&#xff0c;pwron脚外接 3.3V。 2,时钟&#xff1a;MCLKOUT是2…

Python正则表达式(re)

正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为…

已知平面内三点,求其平面的法向量

三点平面法向量 设三点坐标为A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3) 向量AB(x2-x1,y2-y1,z2-z1),AC(x3-x1,y3-y1,z3-z1) AB、AC所在平面的法向量即ABAC(a,b,c),其中&#xff1a; a(y2-y1)(z3-z1)-(z2-z1)(y3-y1) b(z2-z1)(x3-x1)-(z3-z1)(x2-x1) c(x2-x1)(y3-y1)-(x3-x1)(y2-y1)…

JavaScript-DOM实战案例

一、window定时器 1.window定时器方法 有时我们并不想立即执行一个函数&#xff0c;而是等待特定一段时间之后再执行&#xff0c;我们称之为“计划调用&#xff08;scheduling a call&#xff09;”。 目前有两种方式可以实现&#xff1a; setTimeout 允许我们将函数推迟到一…

xen-gic初始化流程

xen-gic初始化流程 调试平台使用的是gic-600&#xff0c;建议参考下面的文档来阅读代码&#xff0c;搞清楚相关寄存器的功能。 《corelink_gic600_generic_interrupt_controller_technical_reference_manual_100336_0106_00_en》 《IHI0069H_gic_architecture_specification》…

【flink进阶】-- Flink kubernetes operator 版本升级

目录 1、检查当前 flink kubernetes operator 版本 2、停止生产上正在运行的 flink job 3、升级 CRD

linux万字图文学习进程信号

1. 信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…

简单记录一下Splunk ES 升级

1: 背景: 现在有些app 产品对splunk ES (enterprise security) 的版本有要求,这个就要求splunk ES 随着Splunk enterprise 也一起升级,下面先列一下各个版本的兼容: Splunk products version compatibility matrix - Splunk Documentation 下面列出的8.2.11 的版本: 2:…