Vue组件化编程的组件通信

news2025/1/26 14:26:21

  对于组件化编程,组件之间的通信技术无疑是非常重要的内容,需要将细节牢牢把握。

  组件通信,就是子组件放置在父组件内之后,父组件如何向子组件传递参数以及子组件如何与外部组件进行互动。

  这部分的知识很重要,需要展开一一掌握,分下面的三种情况进行逐一说明。当然,考虑到组件通信的复杂,后面我写一篇很简单的组件通信,不必考虑父子组件的区别。

  1、父组件向子组件的多种传值方式

  演示代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue.js的组件化编程:组件通信</title>
		<script src="./js/vue2.js"></script>
	</head>
	<body>
		<h1>父组件向子组件传值</h1>
		<div id="app">
			<my-componect my-title="组件标题1" my-content="组件内容1"></my-componect>
			<my-componect v-bind:my-title="'组件标题2'" :my-content="'组件内容2'"></my-componect>
			<my-componect v-bind:my-title="item.title" :my-content="item.content"></my-componect>
		</div>
		<script type="text/javascript">
			Vue.component("myComponect",{
				props:['myTitle','myContent'],
				template:`<div>
					<h3>{{myTitle}}</h3>
					<h6>{{myContent}}</h6>					
					</div>`
			});
			var vm=new Vue({
				el:"#app",
				data:{
					item:{
						title:'组件标题',
						content:'组件内容'
					}
				}
			});
		</script>
	</body>
</html>

  显示结果:

  

  父组件可以有3种方法向子组件传递数据,子组件的props接收的是数组,可以接收多个参数。

  ⑴ 直接传字符串,是静态文本;

  ⑵ 传JavaScript表达式;

  ⑶ 传对象属性值;

  ⑷ 传对象。

  注意点:

  ⑴ props与父组件的data命名最好不要相同。

  ⑵ v-bind: title可以简写为:title。

  传JavaScript表达式或者对象,可以看下面的例子。

  网页代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue.js的组件化编程:组件通信</title>
		<script src="./js/vue2.js"></script>
	</head>
	<body>
		<h1>父组件向子组件传值</h1>
		<div id="app">
			<my-componect :my-data=" { title:'这是组件标题',content:'这是组件内容'}"></my-componect>
			<my-componect :my-data="item"></my-componect>
			<my-componect :my-data="item"></my-componect>
		</div>
		<script type="text/javascript">
			Vue.component("myComponect",{
				props:['myData'],
				template:`<div>
					<h3>{{myData.title}}</h3>
					<input type="text" v-model="myData.content" />
					</div>`
			});
			var vm=new Vue({
				el:"#app",
				data:{
					item:{
						title:'组件标题',
						content:'组件内容'
					}
				}
			});
		</script>
	</body>
</html>

  显示结果:

   可以看出,如果是以对象的方式进行传值,那么当对象的属性改变时,子组件的内容也会发生改变,其实,这也可以作为子组件向外传值的一种方式就是引用方式传值。

  2、子组件向父组件传值以及子组件调用父组件的方法(函数)

   结合上面父组件向子组件传递对象,练习下面的代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue.js的组件化编程:组件通信</title>
		<script src="./js/vue2.js"></script>
	</head>
	<body>
		<div id="app">
			<my-score-sheet v-for="cla in classList" :my-class="cla" :key="cla.id" @data-change="averageFunc"></my-score-sheet>
			<p align="center"><b>学校数学总平均分:{{averageMaths}},学校语文总平均分:{{averageChinese}}</b></p>
		</div>
		<script type="text/javascript">
			Vue.component("myScoreSheet",{
				props:['myClass'],
				data(){
					return {
						classSign:{
							id:0,
							name:'',
							students:[],
						},
						averageMaths:0.0,
						averageChinese:0.0
					}
				},
				created() {
				    this.classSign = this.myClass;
    			},				
				template:`<div>
							<h1 align="center">{{classSign.name}}</h1>
							<table align="center">
								<tr align="center">
									<td>学号</td>
									<td>姓名</td>
									<td>语文</td>
									<td>数学</td>
								</tr>
								<tr v-for="student in classSign.students" :key="student.id">
									<td>{{student.id}}</td>
									<td>{{student.name}}</td>
									<td ><input type="number" v-model="student.maths" @input="dataChange()"/></td>
									<td ><input type="number" v-model="student.chinese" @input="dataChange()"/></td>
								</tr>
							</table>
							<p align="center">班级数学平均分:{{averageMaths}},班级语文平均分:{{averageChinese}}</p>
					</div>`,
				methods:{
					dataChange(){
						let sumMaths=0.0;
						let sumChinese=0.0
						this.classSign.students.forEach(element=>{
							sumMaths+=parseFloat(element.maths);
							sumChinese+=parseFloat(element.chinese);							
						});
						this.averageMaths=sumMaths/Object.keys(this.classSign.students).length;
						this.averageChinese=sumChinese/Object.keys(this.classSign.students).length;

						this.averageMaths=Math.round(this.averageMaths*100)/100;//保留两位小数
						this.averageChinese=Math.round(this.averageChinese*100)/100;//保留两位小数

						// this.$emit('data-change',this.classSign);
						this.$emit('data-change');//调用父组件的方法(函数)
					}
				}
			});
			var vm=new Vue({
				el:"#app",
				data:{
					classList:[
						{ id:1,name:'学霸班',students:[{id:1001,name:'小明',maths:97,chinese:89},{id:1002,name:'小华',maths:83,chinese:91},{id:1003,name:'小黄',maths:75,chinese:86}] },
						{ id:2,name:'青云班',students:[{id:2001,name:'小宋',maths:87,chinese:82},{id:2002,name:'小丽',maths:81,chinese:84},{id:2003,name:'小云',maths:82,chinese:89}] }
					],
					averageMaths:0.0,
					averageChinese:0.0
				},
				methods:{
					averageFunc(){
						let studentCount=0;
						let sumMaths=0.0;
						let sumChinese=0.0
						this.classList.forEach(element => {
							element.students.forEach(student => {
								sumMaths+=parseFloat(student.maths);
								sumChinese+=parseFloat(student.chinese);
								studentCount+=1;
							});

						});
						this.averageMaths=sumMaths/studentCount;
						this.averageChinese=sumChinese/studentCount;

						this.averageMaths=this.averageMaths.toFixed(2);
						this.averageChinese=this.averageChinese.toFixed(2);
					}
				}
			});
		</script>
	</body>
</html>

  输出结果:

  说明:

  ⑴ 子组件调用父组件通过this.$emit('data-change')来完成,当然也可以传递参数给父组件,比如:

this.$emit('data-change',this.classSign)

  那么父组件的函数就应该定义为:

dataChange(cla){}

  其中的cla就表示this.classSign。

  ⑵ 子组件在准备了props和data后,在created中进行对象的绑定

this.classSign = this.myClass;

  因为是引用传值,那么在子组件中的数据改变也同步到了父组件的classList中。

  ⑶ 子组件的数据定义,classSign内部的学生数据定义为students:[],在进行数据绑定的时候就接收了父组件传来的学生列表。

  ⑷ 保留两位小数的函数:

Math.round(this.averageMaths*100)/100
或者
this.averageMaths.toFixed(2)

  ⑸ 数组的统计长度:Object.keys(this.classSign.students).length,this.classSign.students是数组名称。

  3、平行组件之间的通讯,通过emit结合$refs进行。  

  具体的内容在《Vue组件化编程的基础知识要点》中有详细记录。

  通过上面的总结,可能会觉得Vue.js中组件化编程比较麻烦,这么多内容?!其实如果深入思考,完全不是这么一回事情,可以简单明了地抛开上面的技术细节。

  说到底就是自定义事件和事件队列,这个思想与传统的C/S下的组件化编程几乎是相同的,想明白了这一点,组件通信就比较容易了。

  后面会进行总结。

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

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

相关文章

基于Ubuntu20.04搭建OpenHarmony v3.0.6的qemu仿真环境

基于Ubuntu20.04搭建OpenHarmony v3.0.6的qemu仿真环境0. 前言1. 安装Ubuntu1.1 更换华为源1.2 安装必要工具2. 下载代码2.1 解压与目录设置3. 配置环境3.1 安装库和工具3.2 设置python版本3.3 安装编译工具hb3.4 切换dash为bash4. 编译4.1 hb构建4.2 启动qemu5. 第二种环境配置…

Java之日期与时间、JDK8新增日期类、包装类、正则表达式、Arrays类、常见算法和Lambda表达式

目录日期与时间DateSimpleDateFormatCalendar概述JDK8新增日期类概述、LocalTime /LocalDate / LocalDateTimeInstantDateTimeFormatterDuration/PeriodchronoUnit包装类正则表达式Arrays类Arrays类概述&#xff0c;常用功能演示Arrays类对于Comparator比较器的支持常见算法选择…

[论文翻译] GIKT: A Graph-based Interaction Model forKnowledge Tracing

摘要随着在线教育的快速发展&#xff0c;知识追踪&#xff08;KT&#xff09;已成为追踪学生知识状态并预测他们在新问题上的表现的基本问题。在线教育系统中的问题通常很多&#xff0c;并且总是与更少的技能相关联。然而&#xff0c;以往的文献未能将问题信息与高阶问题-技能相…

计网必会:电路交换和分组交换

电路交换和分组交换的概念和区别&#xff0c;为什么分组交换更有效&#xff1f; 电路交换&#xff1a;由于电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路&#xff08;由通信双方之间的交换设备和链路逐段连接而成&#xff09; 特点是源和目标点建立起名副其…

C语言中的void*是什么?

目录1.void *是什么2.void*的解引用3.void*类型的应用场景1.void *是什么 我们之前学过许多类型的指针变量&#xff0c;如整形指针&#xff0c;字符指针&#xff0c;甚至数组指针&#xff0c;函数指针等。 int a 10; int *pa &a;//整形指针pa接受一个整形变量a的地址但…

阻塞队列-BlockingQueue

一、BlockingQueue介绍BlockingQueue 继承了 Queue 接口&#xff0c;是队列的一种。Queue 和 BlockingQueue 都是在 Java 5 中加入的。阻塞队列&#xff08;BlockingQueue&#xff09;是一个在队列基础上又支持了两个附加操作的队列&#xff0c;常用解耦。两个附加操作:支持阻塞…

Win10 每天蓝屏多次,蓝屏代码0x3B:SYSTEM_SERVICE_EXCEPTION

环境&#xff1a; 联想E14笔记本 Win10 专业版 问题描述&#xff1a; Win10 每天发生蓝屏多次&#xff0c;蓝屏代码0x3B:SYSTEM_SERVICE_EXCEPTION 查看事件查看器&#xff0c;系统日志筛选ID1001的事件,蓝屏多次基本上都是3B这错误代码 解决方案&#xff1a; 1.禁用AMD显…

vue3 pinia 状态管理(清晰明了)

前言 最近学习cloud项目&#xff0c;前端使用到 vue3 ts 等技术&#xff0c;其中包括 pinia &#xff0c;从一脸懵到渐渐清晰过程&#xff0c;在此记录一下&#xff0c;若有不足&#xff0c;希望大佬可以指出。 中文官方文档&#xff1a;https://pinia.web3doc.top/ 一、什…

2022年海南省职业院校技能大赛“网络安全”比赛任务书

2022年海南省职业院校技能大赛“网络安全” 比赛任务书 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;350分&#xff09; 一、项目和任务描述&#xff…

服务器怎么防勒索病毒

行业背景 随着金融行业信息化建设的飞速发展&#xff0c;金融行业信息化系统经过多年的发展建设&#xff0c;目前信息化程度已经达到了较高水平。信息技术在提高管理水平、促进业务创新、提升企业竞争力方面发挥着日益重要的作用。 需求分析 随着金融信息化的深入发展&#…

Linux调试器-gdb使用

目录 1. 背景 2. 开始使用 3. 理解 创建需要调试的代码 debug&&release 4 详细调试 list&#xff0f;l 行号 list&#xff0f;l 函数名 r或run break(b) info b(reak) d num disable breakpoints enable breakpoints n (next) s&#xff08;step&#xff09; breaktrac…

ConcurrentHashMap 的优化及其与HashTable, HashMap的区别

目录 1.优化一:减小锁粒度 2.优化二:只针对写操作加锁 3.优化三:CAS 4.优化四:扩容方式 HashMap是线程不安全的,HashTable是线程安全的,关键方法加锁了.我们更推荐的是ConcurrentHashMap ,更优化的线程安全哈希表 接下来我们总结一下ConcurrentHashMap 进行了哪些优化,比H…

Nessus 扫描log4J漏洞

系列文章 Nessus介绍与安装 Nessus Host Discovery Nessus 高级扫描 Nessus 扫描web服务 Nessus 扫描log4J漏洞 1.扫描环境搭建 1.centos7 安装装宝塔面板 2.面板里下载docker 3.进入centos检查docker是否生效 docker --version4.安装docker-compose Docker Compose是一个…

使用WordPress搭建知识库门户网站的优缺点

使用知识库软件进行知识管理&#xff0c;帮助企业节约成本&#xff0c;为客户提供一个自助服务平台&#xff0c;提高客户满意度&#xff0c;据调查&#xff0c;73%的客户宁愿在网上搜索答案&#xff0c;而不是给工作人员打电话或者发短信&#xff0c;搭建一个知识库可能会耗费时…

TCP如何保证可靠传输,为什么应用层还需要确认机制

TCP的可靠传输实现 以下区别&#xff1a; 1、可靠传输&#xff08;有序&#xff0c;保证对方一定接受到&#xff09; 2、流量控制 这两个功能都是依靠滑动窗口来实现的 TCP实现可靠传输依靠的有 序列号、自动重传、滑动窗口、确认应答等机制。 序列号 首先我们说下序列号&am…

文件操作相关知识

1、为什么使用文件 前面我们在实现通讯录时&#xff0c;每次运行结束后&#xff0c;我们所存储的数据都会消失。这是因为我们将数据存储在栈区、堆区等内存上&#xff0c;而内存是不具有持久性的&#xff0c;程序退出时&#xff0c;权限还给操作系统&#xff0c;这些数据就会丢…

Unity 3D PC平台发布|| Unity 3D Web 平台发布||Unity 3D Android平台发布

Unity 3D PC平台发布 PC 是最常见的游戏运行平台。 随着欧美游戏的崛起&#xff0c;PC 平台随之发生游戏登陆大潮。 在 PC 平台上发布游戏的步骤&#xff1a; 打开要发布的 Unity 3D 工程&#xff0c;执行 File → Build Settings 菜单命令。在 Platform 列表框中选择 PC&am…

Jenkins, docker-compose动态修改镜像版本升级部署

docker-compose镜像版本动态控制 提取.env文件进行配置通用环境变量 # 当前机器用户的home路径 HOST_HOME/home/guimu # 上传文件临时路径 TMP_DATA_PATH${HOST_HOME}/tempdata/ # media的home路径 MEDIA_HOME/media # 挂载的mysql的data路径 MYSQL_DATA_PATH${HOST_HOME}/my…

go 函数或者方法参数调用的过程

前言 最近做项目&#xff0c;使用go开发&#xff0c;但是在发生函数调用传参数时&#xff0c;对指针的指针的传递有难以理解的代码&#xff0c;就此分析过程。尤其是对于多重指针作为参数&#xff0c;而且对于一些内置函数的修改逻辑也需深入的理解。 1. demo package slice…

client-go源码学习(四):自定义Controller的工作原理、WorkQueue

本文基于Kubernetes v1.22.4版本进行源码学习&#xff0c;对应的client-go版本为v0.22.4 4、自定义Controller的工作原理 Controller中主要使用到Informer和WorkQueue两个核心组件 Controller可以有一个或多个Informer来跟踪某一个resource。Informer跟Kubernetes API Server保…