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

news2024/10/6 8:30:38

引言

在这里插入图片描述

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

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

在这里插入图片描述

一、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.div

vm.$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.coloradmin.cn/o/1018006.html

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

相关文章

红心向阳 百鸟朝凤

背景 最近在玩 folium 模块&#xff0c;基于使用过程中的一些个人体验&#xff0c;对 folium 进行了二次封装&#xff0c;开源在 GpsAndMap.在使用的过程中&#xff0c;发现在地图上打图标是可以进行旋转的。遇到就发现了一些有意思的玩法。 隔海的相望 下面的代码在地图 厦…

GIS跟踪监管系统信息查询

GIS跟踪监管系统信息查询 GIS跟踪监管系统&#xff08;1&#xff09;物资查询与展示。① 几何查询。代码说明&#xff1a;② 物资定位。• 单个物资定位&#xff1a;• 多个物资定位&#xff1a;③ 物资统计。&#xff08;2&#xff09;物资信息更新① 新增物资。 GIS跟踪监管系…

【项目经验】:elementui表格中数字汉字排序问题及字符串方法localeCompare()

一.需求 表格中数字汉字排序&#xff0c;数字按大小排列&#xff0c;汉字按拼音首字母&#xff08;A-Z&#xff09;排序。 二.用到的方法 第一步&#xff1a;把el-table-column上加上sortable"custom" <el-table-column prop"date" label"序号…

第七章 查找 一、查找的基本概念

一、基本概念 查找——在数据集合中寻找满足某种条件的数据元素的过程称为查找。 查找表(查找结构)——用于查找的数据集合称为查找表&#xff0c;它由同一类型的数据元素(或记录)组成。 关键字——数据元素中唯一标识该元素的某个数据项的值&#xff0c;使用基于关键字的查…

2023年的深度学习入门指南(27) - CUDA的汇编语言PTX与SASS

通过前面的学习&#xff0c;我们了解了在深度学习和大模型中&#xff0c;GPU的广泛应用。可以说&#xff0c;不用说没有GPU&#xff0c;就算是没有大显存和足够先进的架构&#xff0c;也没法开发大模型。 有的同学表示GPU很神秘&#xff0c;不知道它是怎么工作的。其实&#x…

Vue2.7 封装 Router@4 的 hook

1、问题 在 Vue2.7 中&#xff0c;尤大大是支持大部分 Vue3 的功能&#xff0c;并且支持使用 CompositionAPI 的写法&#xff0c;也支持 script setup 的便捷语法&#xff0c;但是 Vue2 对应的 Vue-router3 库并没有提供 hook 对应的支持&#xff0c;所以需要我们自行封装 Vue…

代码对比工具,都在这了

Git Diff Git是一个流行的分布式版本控制系统&#xff0c;它内置了代码对比功能。使用git diff命令可以比较两个不同版本的代码文件&#xff0c;也可以使用图形化的Git客户端进行可视化对比。 git diff 命令 | 菜鸟教程www.runoob.com/git/git-diff.html Diff diff是一个Un…

NAND价格第4季度回暖,现在是SSD入手时机吗?

这两天有粉丝后台在咨询购买SSD相关的问题。小编也好奇的搜下当前业内SSD品牌。不搜不知道&#xff0c;一搜吓一跳&#xff0c;将近200多个品牌。 那么&#xff0c;买SSD应该买什么品牌&#xff1f;现在是否可以入手SSD呢&#xff1f; 1.固态硬盘SSD的原理 我们首先了解下固态…

兄弟DCP-7080激光打印机硒鼓清零方法

兄弟DCP-708打印机清零方法?兄弟DCP-7080打印机的硒鼓计数器是用来记录硒鼓使用寿命的&#xff0c;当硒鼓使用寿命达到一定程度时&#xff0c;打印机会提示更换硒鼓。如果用户更换了硒鼓&#xff0c;但打印机仍提示需要更换&#xff0c;这时需要进行清零操作&#xff0c;详细请…

xen-gic初始化流程

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

基于SSM的实验室开放管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

「信号与系统」语音信号的语谱图、尺度变化、带限处理、基音提取

「信号与系统」语音信号的语谱图、尺度变化、带限处理、基音提取 本文将简单介绍几种语音信号的处理方法。 1、语谱图 语谱图是一种描述语音信号频率特征的方法&#xff0c;横轴表示时间&#xff0c;纵轴表示频率&#xff0c;颜色深浅表示能量。基本原理是将语音信号分帧&am…

js中this的原理详解(web前端开发javascript语法基础)

欢迎关注作者微信公众号&#xff1a;愤怒的it男 一、问题的由来 学懂 JavaScript 语言&#xff0c;一个标志就是理解下面两种写法&#xff0c;可能有不一样的结果。 var angry_it_man {name : 欢迎关注微信公众号&#xff1a;angry_it_man,say : function(){console.log(thi…

学习SLAM:SLAM进阶(十)暴力更改ROS中的PCL库

话不多说&#xff0c;上活 1.1 为什么要这么做 项目中有依赖。。。。 1.2 安装VTK7.1.1 PCL1.8.0 略 1.3 移植到ROS 删除ROS依赖的vtk6.2和PCL1.8.0的动态链接库&#xff1a; liugongweiubuntu:~$ sudo mv /usr/lib/x86_64-linux-gnu/libvtk* Desktop/lib/ [sudo] password fo…

windows平台 git bash使用

打开所在需要git管理的目录,鼠标右键open Git BASH here 这样就直接进来,不需要windows dos窗口下麻烦的切路径&#xff0c;windows和linux 路径方向不一致 (\ /) 然后git init 建立本地仓库,接下来就是git相关的操作了. 图形化界面查看 打开所在需要git管理的目录,鼠标右键…

DipC 构建基因组 3D 结构(学习笔记)

背景 本文主要记录了 DipC 数据的复现过程、学习笔记及注意事项。 目录 下载 SRA 数据使用 SRA Toolkit 转换 SRA 数据为 Fastq 格式使用 bwa 比对测序数据使用 Hickit 计算样本的基因组 3D 结构使用散点图展示 3D 结构计算 3D 结构重复模拟的稳定性其他 步骤 1. 下载 SRA…

从输入一个网址到浏览器页面展示到底发生了什么

从输入一个网址到浏览器页面展示到底发生了什么 1. HTTP 解析URL 首先浏览器做的第一步工作就是解析URL&#xff0c;从而生产一个发送给服务器的请求信息。 URL是什么呢&#xff0c;见下图&#xff1a; 图中长长的URL实际上是请求服务器里的文件资源。 要是上图中的蓝色部分…

ES6中新增加的Symbol数据类型及其使用场景

聚沙成塔每天进步一点点 ⭐ 专栏简介在这里插入图片描述 ⭐ ES6中的Symbol数据类型⭐ 对象属性名称⭐ 防止属性冲突⭐ 内置Symbols⭐ 迭代器和生成器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航…

笔记 | 非素数个数(朴素筛查 || 埃式筛查法)

非素数个数 题目描述朴素筛查方法题解 题目描述 求a-b之间的非素数个数 特别的&#xff0c;1也算作素数&#xff0c;区间是[a, b]。 输入输出格式 输入描述: 多组测试数据。 输入两个正整数数a,b&#xff0c;其中a<b<10^7。 输出描述: 输出答案。 输入输出样例 输入样例…

ESDA in PySal (3):Geosilhouettes:集群拟合的地理测量

ESDA in PySal (3):Geosilhouettes:集群拟合的地理测量 Silhouette statistics (Rousseeuw, 1987) 是观测值与给定聚类的拟合优度的非参数度量。 在聚类具有“地理”解释的情况下,例如当它们代表地理区域时,轮廓统计可以结合“空间思维”,以便提供更有用的聚类拟合度量。…