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.rhkb.cn/news/134836.html

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

相关文章

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类&#xff0c;具备参数管理功能。 例如&#xff1a; nn.Linear, nn.Flatten, nn.Dropout, nn.BatchNorm2d, nn.Embedding nn.Conv2d,nn.AvgPool2d,nn.Conv1d,nn.ConvTr…

用AI在小红书做早教启蒙,2个月涨粉11.7万,获赞10万的新流量玩法

本期是赤辰第29期AI项目教程&#xff0c;底部准备了9月粉丝福利&#xff0c;可以免费领取。母婴、教育一直以来是最不缺流量的两大“真香”赛道。那么AI时代下有怎样新流量红利和玩法&#xff1f;接下来就给大家拆解一个在小红书上做AI绘画启蒙早教资源变现的新玩法&#xff01…

Dajngo06_Template模板

Dajngo06_Template模板 6.1 Template模板概述 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术 静态网页&#xff1a;页面上的数据都是写死的&#xff0c;万年不变 动态网页&#xff1a;页面上的数据是从后端动态获取的&#xff08;后端获取数据库…

每日一博 - 防范彩虹表攻击_数据库存储密码的秘密武器

文章目录 概述图解小结 概述 加盐&#xff08;salting&#xff09;是一种安全存储数据库中密码并验证其真实性的常见方法&#xff0c;它的主要目的是增加密码的安全性&#xff0c;以防止常见的密码攻击&#xff0c;如彩虹表攻击。以下是关于如何使用加盐技术的简要介绍&#x…

Eclipse开源代码下载

当前插件开发&#xff0c;需要修改eclipse源码&#xff0c;如需要修改remote相关的代码&#xff0c;所以需要下载相关源码。网上大多资料都说的不清不楚的&#xff0c;也可能我太小白&#xff0c;不明白&#xff0c;反正就是折腾了一两天才感觉有点思路&#xff0c;改如何找源码…

信息安全三级真题一

目录 一、单选题 二、填空题 三、综合题 一、单选题 二、填空题 三、综合题 知法懂法&#xff0c;请各位网络安全从业者遵守《网络安全法》、《个人信息保护法》 业%$务*$&联&#系 XHU3ZjUxXHU3ZWRjXHU4ZmQwXHU3ZWY0XHU2ZTE3XHU5MDBmXHU1NmUyXHU5NjFmXHUyMDBiXHU2M…

安卓抓jdwskey

安装京东&#xff0c;VNET VNET下载地址 https://www.vnet-tech.com/zh/ 2给权限 打开 VNET --点击右下角 ▶ --保存 CA.pem 证书 --打开手机系统设置搜索 证书–点击安装刚刚保存的 CA.pem 如果开始出现数据表示已经有权限抓包了&#xff0c;下面给权限跳过&#xff0c;直接开…

【PowerQuery】Excel的PowerQuery按需刷新

将数据通过PowerQuery 导入进来后,这里将进行数据分组运算,最终的数据计算结果将保存在Excel 表格中,图为销售统计结果。 在Excel中,如果我们希望进行销售统计的手动更新可以使用几种不同的方法来进行刷新: 刷新单一数据连接如果仅仅需要刷新单一数据连接的话我们可以通过…

MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式&#xff1a;KaTeX parse error: Expected EOF, got # at position 4: {}和#̲{} 5.1、单个字面量类型的…{}和#{}以任意的名称获取参数的值&#xff0c;注意${}需要手动加单引号 ${} #{} 测试代码&#xff1a; 实验…

CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

在资源管理模块中有一个很重要的功能&#xff1a; Asset Bundle&#xff0c;那什么是Asset Bundle &#xff1f;有什么作用&#xff1f;怎么使用 Asset Bundle呢 &#xff1f; 一、什么是Asset Bundle &#xff1f;有什么作用&#xff1f; 在日常游戏开发过程中&#xff0c;为了…

TCP详解之滑动窗口

TCP详解之滑动窗口 引入窗口概念的原因 我们都知道 TCP 是每发送一个数据&#xff0c;都要进行一次确认应答。当上一个数据包收到了应答了&#xff0c; 再发送下一个。 这个模式就有点像我和你面对面聊天&#xff0c;你一句我一句。但这种方式的缺点是效率比较低的。 如果你…

TS泛型的使用

函数中使用泛型&#xff1a; function identity<T>(arg: T): T {return arg; }let result identity<number>(10); // 传入number类型&#xff0c;返回number类型 console.log(result); // 输出: 10let value identity<string>(Hello); // 传入string类型&a…

TCP详解之重传机制

TCP详解之重传机制 TCP 实现可靠传输的方式之一&#xff0c;是通过序列号与确认应答。 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回一个确认应答消息&#xff0c;表示已收到消息。 但在错综复杂的网络&#xff0c;并不一定能如上图那么顺…

阿里云无影云电脑详细介绍_无影优势价格和使用

什么是阿里云无影云电脑&#xff1f;无影云电脑&#xff08;原云桌面&#xff09;是一种快速构建、高效管理桌面办公环境&#xff0c;无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景&#xff0c;阿里云百科分享无影云桌面的详细介绍、租用价格、…

【CentOS7】vsftpd学习笔记

2023年9月14日&#xff0c;周四下午 目录 安装vsftpd添加账号给账户设置新密码开放21号端口关闭21号端口查看vsftpd的运行状态启动vsftpd关闭vsftpd查看CentOS7的IP地址在Windows测试你的运行在CentOS7的用vftpd构建的FTP服务器查看Windows自带的ftp程序有哪些可用的命令 安装…

【C++】list的模拟实现【完整理解版】

目录 一、list的概念引入 1、vector与list的对比 2、关于struct和class的使用 3、list的迭代器失效问题 二、list的模拟实现 1、list三个基本函数类 2、list的结点类的实现 3、list的迭代器类的实现 3.1 基本框架 3.2构造函数 3.3 operator* 3.4 operator-> 3…

FFmpeg入门之Windows/Linux下FFmpeg源码编译

1.源码下载: git clone https://github.com/FFmpeg/FFmpeg.git windows : macos: ubuntu: 2.编译FFmpeg CompilationGuide – FFmpeg windows: 1.下载yasm并安装 : Download - The Yasm Modular Assembler Project 下载后复制到c:/windows 2.下载SDL 3.下载H264/265源码 git…

Scrum敏捷开发流程及敏捷研发关键环节

Scrum是一个迭代式增量软件开发过程&#xff0c;是敏捷方法论中的重要框架之一。它通常用于敏捷软件开发&#xff0c;包括了一系列实践和预定义角色的过程骨架。Scrum中的主要角色包括Scrum主管&#xff08;Scrum Master&#xff09;、产品负责人&#xff08;Product Owner&…

《C++ primer plus》精炼(OOP部分)——对象和类(5)

“学习是照亮心灵的火炬&#xff0c;它永不熄灭&#xff0c;永不止息。” 文章目录 类的自动和强制类型转换原始类型转换为自定义类型将自定义类型转换为原始类型 类的自动和强制类型转换 原始类型转换为自定义类型 可以用一个参数的构造函数来实现&#xff0c;例如&#xff…