Vue组件间通信的方式

news2024/12/22 23:29:23

目录

常用的父子组件通讯方式:props,emit

2.$parent,$children

3.$ref 

4.provide/inject

5.EventBus 事件总线 (任意两个组件通讯)

6.$attrs、$listener 

7.Vuex 状态管理器

8.localStorage/sessionStorage 


    在开发中,组件之间是需要通信的,常用到的组件通信方式有:props与emit、$parent与$children,vuex、以及eventBus,除此之外,还有provide与inject、$attrs与$listeners等。

🧨🧨🧨常用的父子组件通讯方式:props,emit

    父组件传入属性,子组件通过props来接收,在子组件中就可以用this.xxx方式使用。

    子组件通过$emit(事件名,参数)向外弹出一个自定义事件,在父组件中的属性监听事件,可以获得子组件中传出来的值。

//	父组件
<hello-world msg="hello world!" @confirm="handleConfirm"><hello-world>
//	子组件
 props: {
    msg: {
      type: String,
      default: ''
    }
  },
  methods:{
  	handleEmitParent(){
  		this.$emit('confirm', list)
  	}
  }

🧨🧨🧨2.$parent,$children

    通过 $parent,$children 来访问组件实例,进而去获取 或者 改变父子组件的值。 (仅限于父子组件之间,不推荐使用,因为不利于维护,一旦组件层次发生了变化,就需要更改其中的层次关系)

    需要注意边界,最外层的#app 的$parent得到的是Vue实例,在Vue实例上再去取$parent 就是undefined了。 在最底层的组件中 $children是[]。

以父组件为桥梁去注册事件和触发事件来实现的兄弟组件通讯

//子组件一
this.$patent.$on('confirm',handleConfirm)
//子组件二
this.$patent.$emit('confirm',list)

 获取第一个子组件的数据和调用根组件的方法

//获取第一个子组件的数据

console.log(this.$children[0].msg)

//调用根组件的方法

this.$root.handleRoot()

🧨🧨🧨3.$ref 

通过引用的方式获取子节点,常用于父组件中调用子组件的方法或者获取子组件的属性。 注意:如果绑在的是v-for的节点上,那么获取到的是一个数组。


//Parent.vue

<template>
	<view class="">
		<child ref="child"></child>
	</view>
</template>

<script>
	// 引入组件
	import child form './child.vue';
	export default {
		data(){
			return {
				
			}
		},
		mounted(){
			const child = this.$refs.child
			console.log(child.name) // 痴心阿文
			child.someMethods("调用了子组件的方法")
		},
		methods:{
			
		}
	}
</script>
//Child.vue

<template>
</template>

<script>
	export default {
		data(){
			return {
				name:'痴心阿文'
			}
		},
		methods:{
			somemethods(msg){
				console.log(msg)
			}
		}
	}
</script>

<style>
</style>

🧨4.provide/inject

    依赖注入,常见于插件或者组件库里。

    多个组件嵌套时,顶层组件provide提供变量,后代组件都可以通过inject来注入变量。

<template>
	<view class="">
		
	</view>
</template>

<script>
	//顶层组件
	export default {
		provide(){
			return {
				msg:'hello world'
			}
		}
	}
	//后代组件
	export default {
		inject:{
			'msg'
		}
	}
</script>

<style>
</style>

    缺陷:传递的数据不是响应式的,inject接收到数据后,provide中的数据改变,但是后代组件中的数据不会改变。所以 建议传一些常量或者方法。

		//父组件
		export default {
	        //方法一 不能获取methods 中的方法
			provide(){
				name:'痴心阿文',
	            age:this.data中的属性
			},
	        //方法二 不能获取data中的属性
	        provide(){
				name:'痴心阿文',
	            someMethods:this.someMethod //methods中的方法
			},
			methods:{
				someMethod(){
					console.log("这是注入的方法")
				}
			}
		}
		//后代组件
		export default {
			inject:["name","someMethods"],
			mounted() {
				console.log(this.name)
				this.someMethod()
			}
		}

🧨🧨🧨5.EventBus 事件总线 (任意两个组件通讯)

<template>
	<view class="">
		<button @click="handlerClick">按钮</button>
	</view>
</template>

<script>
	//在需要向外部发送自定义事件的组件内
	import Bus './Bus.js';
	export default {
		data(){
			return {
				
			}
		},
		methods:{
			handlerClick(){
				//自定义事件名 sendMsg
				Bus.$emit("sendMsg","这是要向外部发送的数据")
			}
		}
	}
	//在需要接受外部时间的组件内
	import Bus './Bus.js';
	export default {
		data(){
			return {
				
			}
		},
		methods:{
			handlerClick(){
				//自定义事件名 sendMsg
				Bus.$emit("sendMsg","这是要向外部发送的数据")
			}
		}
	}
</script>

<style>
</style>

 用 $emit去监听,用$on去触发,注意需要$off来取消监听,否则可能会造成内存泄漏。

🧨6.$attrs、$listener 

    适用于多级组件嵌套,但是不做中间处理的情况。比如祖先组件向孙子组件传递数据。

    $attrs 可以获取父组件传进来,但是没有用props接收的属性。

    可以通过v-bind="$attrs"传入内部组件。

    搭配inheritAttrs使用,这个只是用来控制attrs是否在DOM中渲染。

<template>
	<view class="">
		<Child :title="title" :desc="desc"></Child>
	</view>
</template>

<script>
	import Child form './Child.vue';
	export default {
		data() {
			return {
				
			}
		},
		conponents:{
			Child
		}
		methods:{
			
		}
	}
</script>

<style>
</style>

//子组件内

<template>
	<view class="">
		<h2>{{title}}</h2>
		<p>{{$attrs.desc}}</p>
	</view>
</template>
<script>
	export default {
		props:[
			'title'
		]
		data() {
			return {
				
			}
		},
		methods:{
			
		}
	}
</script>

<style>
</style>

    $listeners 包含父作用域中的(不包含.native的) v-on时间监听器。

    可以通过v-on="$listeners"来传入内部组件。

🧨🧨🧨7.Vuex 状态管理器

    集中式存储管理所有组件的状态。 

    可以解决 多个视图依赖同一个状态 或者是 来自不同视图的行为需要变更同一个状态 的问题。

    这个相信大家用的很多了,回顾一下:

  •     State:放状态的地方
  •     Mutation:唯一修改状态的地方,不支持异步
  •     Action:通过调用Mutation中的方法来达到修改状态的目的,支持异步
  •     Getter:可以理解为计算属性
  •     Module:模块,每个模块拥有自己的 state、mutation、action、getter
  •     简单的使用这里不赘述,提一下module里面的命名空间。

🧨🧨🧨8.localStorage/sessionStorage 

    持久化存储。

    本地存储

    缓存

    这种通信比较简单,缺点是数据和状态比较混乱,不太容易维护。

  1.     通过window.localStorage.getItem(key)获取数据
  2.     通过window.localStorage.setItem(key,value)存储数据

    注意用JSON.parse() / JSON.stringify() 做数据格式转换, localStorage / sessionStorage可以结合vuex, 实现数据的持久保存,同时使用vuex解决数据和状态混乱问题.。

🧨🧨🧨最后:

    常见使用场景可以分为三类:

  •     父子组件通信: props/$emit、$parent/$children、 provide/inject 、 ref/$refs 、$attrs/$listeners、slot
  •     兄弟组件通信: eventBus 、 vuex、 自己实现简单的 Store 模式
  •     跨级通信: eventBus、 Vuex、 自己实现简单的 Store 模式、 provide / inject 、 $attrs / $listeners

 方法很多也不用纠结哪种,工作中拿自己最擅长的就好了~~

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

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

相关文章

相见恨晚,这6个适合安卓用户的浏览器,你用过吗

每个人手机里面有一款浏览器&#xff0c;当我们遇到问题的时候&#xff0c;可以打开浏览器搜索自己想要的答案。如果选用的手机浏览器不好&#xff0c;那么手机上可能会被安装很多垃圾软件。下面&#xff0c;和大家聊聊几款好用、适合安卓用户的浏览器&#xff0c;个人觉得这些…

【逐步剖C】第四章-操作符

​ 一、算术操作符 即基本的、-、*、/ 和 %。但也有几个需要注意的地方&#xff1a; 除了 ‘%’ 取模操作符只能作用整数&#xff0c;其他可以作用于整数和浮点数 对于除法&#xff0c;只要有操作数为浮点数就执行浮点数除法。如果两个操作数都为整数&#xff0c;执行整数除…

python多进程、多线程(详细)

多任务概念同一时间执行多个任务多任务优势最大的好处是充分利用CPU资源&#xff0c;提高程序的执行效率GIL锁&#xff08;全局解释锁&#xff09;让一个进程中同一个时刻只有一个线程可以被CPU调用&#xff0c;可以解决线程安全问题&#xff0c;有线程锁也有进程锁Rlock&#…

「自控元件及线路」1.3 直流电动机的特性与控制方法

本节介绍电机的基本物理量和基本关系 本节介绍直流电机的静态特性以及动态特性 本节介绍直流电机的控制方法、启动方法、稳定运行条件 本节介绍直流电动机的四种工作状态 本节介绍控制系统中应用的直流电动机的类型 文章目录基础知识基本物理量&#xff1a;电磁转矩与电枢反电势…

将TensorFlow模型快速迁移到昇腾平台

当前业界很多训练脚本是基于TensorFlow的Python API进行开发的&#xff0c;默认运行在CPU/GPU/TPU上&#xff0c;为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练&#xff0c;需要对TensorFlow的训练脚本进行迁移。首先&#xff0c;我们了解下模型迁移的全流程&#xff…

.net6Api返回统一结果+Vue3前端访问

目录 第一种 第二种 第三种 Vue3前端访问 在我们开发api的时候&#xff0c;需要让接口返回统一的接口&#xff0c;这样容易理解&#xff0c;也容易管理。所以封装返回的统一结果是非常必要的。 下面介绍3种方案。 第一种 建立一个控制器&#xff0c;让所有控制器都继承…

电脑休眠唤醒后会出现屏幕闪烁问题怎么彻底解决?

电脑休眠唤醒后会出现屏幕闪烁问题怎么彻底解决&#xff1f;有的用户在电脑待机休眠之后&#xff0c;重新去唤醒电脑使用&#xff0c;这个时候电脑屏幕就会出现验证的屏幕闪烁&#xff0c;导致无法进行正常的使用。这个情况是电脑系统不兼容导致的。如果想要彻底解决问题&#…

NoClassDefFoundError错误解决

NoClassDefFoundError 类型报错 NoClassDefFoundError与ClassNotFoundException略有区别&#xff0c;从两者的异常类型可以发现&#xff0c;前者属于Error&#xff0c;后者属于Exception&#xff0c;发生了Error往往会导致程序直接崩溃或者无法启动运行。 NoClassDefFoundErro…

ecchart关系图展示(知识图谱)

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>ECharts 关系图</title><script type"text/javascript" src"http://code.jquery.com/jquery-3.5.1.min.js"></script><script s…

蓝桥杯-迷宫

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个30行50列的方格&#xff0c;方格由0和1组成&#xff0c;1 表示障碍物&#xff0c;0表示可行的方块。人从最上边开始行走&#xff0c;逃出这个迷宫&#xff0c;走到…

Git 之reflog回滚操作失误

前言 以前只知道有git log命令&#xff0c;并不知道有git reflog。今天一个偶然的机会&#xff0c;我不小心把自己前两天写的代码给整丢了&#xff0c;如果时几个小时的代码&#xff0c;我重新写一遍就算了&#xff0c;但是这次不一样&#xff0c;这次是非常重大的修改&#x…

openfeign集成sentinel实现服务降级

openfeign集成sentinel实现服务降级使用openfeign调用服务&#xff08;不含sentinel&#xff09;代码测试openfeign集成sentinel实现服务降级引入sentinel相关环境编写FeignClient注解接口的实现类在服务提供者中&#xff0c;认为添加异常代码&#xff0c;以供测试 / 或者不启动…

SpringBean的生命周期

下文要讲的均是spring的默认作用域singleton的bean的生命周期&#xff0c;对spring作用域不了解的可以 https://blog.csdn.net/hlzdbk/article/details/128811271?spm1001.2014.3001.5502 什么是SpringBean的生命周期 springBean的生命周期&#xff0c;指的是spring里一个be…

Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析

目录前言一&#xff0c;确定目标二&#xff0c;发送请求三, 解析数据四, 保存数据pyecharts进行可视化“某站”数据排名前10视频类型“某站”标题标签可视化“某站”喜欢视频分类概况总结前言 本项目将会对“某站”热搜排行的数据进行网页信息爬取以及数据可视化分析 本教程仅…

数据结构:栈的学习

作者&#xff1a;爱塔居 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步 目录 一、栈 1.1 概念 1.2 栈的使用 1.3 示例 二、栈的应用场景 2.1 改变元素的序列 2.2 逆波兰表达式求值 2.3 括号匹配 2.4 栈的压入、弹出序列 一、栈…

upstream sent duplicate header line: “Transfer-Encoding: chunked“

实际情景&#xff1a; 公司项目有一个下载文件的功能&#xff0c;没有经过Nginx代理之前&#xff0c;好好的&#xff0c;正常下载&#xff1b; 加入了Nginx代理之后&#xff0c;过Nginx访问就会有 err_empty_response 这个错误&#xff1b; 搞了半天&#xff0c;nginx.conf加入…

第一章 linux概述

第一章 Linux概述 1、为什么要使用Linux Linux内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支…

【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

矩阵键盘 一.基础知识 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式采用逐行或逐列的“扫描”&#xff0c;就可以读出任何位置按键的状态 矩阵键盘和独立按键一样&#xff0c;也需要进行消抖处理&#xff01; 于此补充一下抖…

c++之基础入门一

一、c的初始化typedef struct student {int age;char name[10];int num; }student;int main() {//在c中可以利用花括号进行初始化struct student student1{12,"zs",123456 };int a 10, b 20;int b{ 20 }, a{ 10 };double c{ 20 };int* p{ nullptr };int arr[10]{ 1…

Day877.数据空洞 -MySQL实战

数据空洞 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于数据空洞的内容。 数据库占用空间太大&#xff0c;把一个最大的表删掉了一半的数据&#xff0c;怎么表文件的大小还是没变&#xff1f; 一个 InnoDB 表包含两部分&#xff0c;即&#xff1a; 表结构定义数…