Chapter 15 组件通信

1 组件通信方式

在 Vue 中,组件通信是指多个组件之间传递数据或消息的方式。
由于每个组件的数据是独立的,它们不能直接访问其他组件的数据,因此需要使用一些特定的方式来实现数据传递和通信。

【组件通信方式】
1. 父子组件通信:父组件和子组件之间的数据传递。
在这里插入图片描述
在这里插入图片描述

2. 非父子组件通信:比如兄弟组件或跨组件的通信。

在这里插入图片描述

2 父子组件通信

在 Vue 中,父子组件的通信主要有两种方式:

  • 通过 props 传递数据
  • 通过 $emit 发送事件

【父子通信流程图】

  • 父组件通过 props 将数据传递给子组件
  • 子组件利用 $emit 通知父组件修改更新
    父组件
    在这里插入图片描述

【示例1】
父组件App.vue

<template><div class="app" style="border: 3px solid #000; margin: 10px">我是APP组件 <Son></Son></div>
</template><script>
import Son from './components/Son.vue'
export default {name: 'App',data() {return {myTitle: 'Hello Vue!',}},components: {Son,},
}
</script><style>
</style>

子组件Son.vue

<template><div class="son" style="border:3px solid #000;margin:10px">我是Son组件</div>
</template><script>
export default {name: 'Son-Child',
}
</script><style></style>

运行结果:
在这里插入图片描述
1. 父组件通过 props 向子组件传递数据
①给子组件以添加属性的方式传值
②子组件内部通过props接收
③渲染使用
在这里插入图片描述
运行结果:

在这里插入图片描述
【解析】

  • 父组件传值: 在父组件 App.vue 中,使用 :myTitle="myTitle" 将父组件的数据 myTitle 传递给子组件 Son.vue。
  • 子组件接收: 在 Son.vue 中,子组件通过 props 接收父组件传递的数据,并在模板中展示。

2. 子组件通过 $emit 通知父组件
$emit 触发事件,给父组件发送消息通知
②父组件监听事件
③提供处理函数,写明处理逻辑

在这里插入图片描述

运行结果:
在这里插入图片描述
点击“修改title”:
在这里插入图片描述
【解析】

  • 子组件触发事件: 在子组件 Son.vue 中,点击按钮会触发 changeFn 方法,进而调用 this.$emit(changeTitle', '修改后的标题'),通知父组件 App.vue。
  • 父组件监听事件: 在父组件 App.vue 中,使用 @changeTitle="handleChanged" 来监听子组件的 changeTitle 事件,并通过 handleChanged 方法处理事件,修改父组件的 myTitle 数据。

【示例2】
父组件App.vue

<template><div class="app"><UserInfo></UserInfo></div>
</template><script>
import UserInfo from './components/UserInfo.vue'
export default {data() {return {username: '小帅',age: 28,isSingle: true,car: {brand: '宝马',},hobby: ['篮球', '足球', '羽毛球'],}},components: {UserInfo,},
}
</script><style>
</style>

子组件UserInfo.vue

<template><div class="userinfo"><h3>我是个人信息组件</h3><div>姓名:</div><div>年龄:</div><div>是否单身:</div><div>座驾:</div><div>兴趣爱好:</div></div>
</template><script>
export default {}
</script><style>
.userinfo {width: 300px;border: 3px solid #000;padding: 20px;
}
.userinfo > div {margin: 20px 10px;
}
</style>

在这里插入图片描述
运行结果:
在这里插入图片描述
优化:
在这里插入图片描述
运行结果:
在这里插入图片描述

3 props校验

1. 定义
props 是父组件向子组件传递数据的主要方式。为了确保传递的数据类型正确并满足特定条件,可以为 props 定义校验规则。

2. 作用

  • 传递数据时,通过校验可以保证数据的类型正确性格式符合预期
  • 如果传递了错误的数据类型或缺少必传属性,Vue 会在开发环境下提供警告

3. 特点

  • 支持任意数量的 prop:每个组件可以接收多个 prop。
  • 支持任意类型的 prop:可以传递任意数据类型的值(如字符串、数组、对象、布尔值等)。
  • 可定义默认值、类型、是否必传等校验规则。

4. 语法

①类型校验

props : {校验的属性名 : 类型
}

【示例】

父组件App.vue

<template><div class="app"><BaseProgress :w="width"></BaseProgress></div>
</template><script>
import BaseProgress from './components/BaseProgress.vue'
export default {data() {return {width: 30,}},components: {BaseProgress,},
}
</script><style>
</style>

子组件BaseProgress.vue

<template><div class="base-progress"><div class="inner" :style="{ width: w + '%' }"><span>{{ w }}%</span></div></div>
</template><script>
export default {/* 无校验 props: ['w'],*/// props校验props:{w:Number}
}
</script><style scoped>
.base-progress {height: 26px;width: 400px;border-radius: 15px;background-color: #272425;border: 3px solid #272425;box-sizing: border-box;margin-bottom: 30px;
}
.inner {position: relative;background: #379bff;border-radius: 15px;height: 25px;box-sizing: border-box;left: -3px;top: -2px;
}
.inner span {position: absolute;right: 0;top: 26px;
}
</style>

在这里插入图片描述
运行结果:
在这里插入图片描述

如果传入错误的参数:
在这里插入图片描述
运行结果:
在这里插入图片描述

②完整写法

props : {校验的属性名 : {type : 类型,required : true,  // 是否必填default : 默认值,  // 默认值validator(value){// 自定义校验逻辑return 是否通过校验}}
}

【示例】

<script>
export default {// 完整写法(类型、默认值、非空、自定义校验)props: {w: {type: Number,//required: true,default: 0,validator(val) {// console.log(val)if (val >= 100 || val <= 0) {console.error('传入的范围必须是0-100之间')return false} else {return true}},},},
}
</script>

如果 w=200,运行结果:
在这里插入图片描述

【注意】
defaultrequired 一般不同时写(因为当有必填项时,肯定是有值的)

default 后面如果是简单类型的值,可以直接写默认。如果是复杂类型的值,则需要以函数的形式 return 一个默认值
【示例】
简单类型的默认值:

props: {name: {type: String,default: '默认名字'  // 直接写默认值},age: {type: Number,default: 18  // 直接写默认值},isSingle: {type: Boolean,default: true  // 直接写默认值}
}

复杂类型的默认值:

props: {car: {type: Object,default() {return { brand: '宝马', model: 'X5' };  // 使用函数返回默认值}},hobbies: {type: Array,default() {return ['篮球', '足球', '羽毛球'];  // 使用函数返回默认值}}
}

4 单向数据流

在 Vue 中,数据流动的方向通常是单向的,即从父组件流向子组件,该特性确保了组件的封装性可维护性
无论是 data 还是 props,都可以为组件提供数据,但是它们的来源和使用方式有所不同。

【区别】

  • data 的数据是组件自身的,可以随意修改
  • props 的数据是外部传递的,子组件只能读取,不能直接修改,必须遵循单向数据流的原则,即数据从父组件流向子组件。

【单向数据流】

  • 父组件通过 props 向子组件传递数据。
  • 如果父组件更新了 props,这个变化会反映在子组件中,子组件的数据会被更新。
  • 子组件不能直接修改 props,而是通过事件或其他方式向父组件发送请求,父组件再更新自己的数据,从而触发子组件的重新渲染。
    在这里插入图片描述

【示例】

父组件App.vue

<template><div class="app"><BaseCount></BaseCount></div>
</template><script>
import BaseCount from './components/BaseCount.vue'
export default {components:{BaseCount},data(){},
}
</script><style></style>

子组件BaseCount.vue

<template><div class="base-count"><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button></div>
</template><script>
export default {// 自己的数据随便修改  (谁的数据 谁负责)data () {return {count: 100,}}
}
</script><style>
.base-count {margin: 20px;
}
</style>

运行结果:
在这里插入图片描述
如果子组件尝试直接修改数据:
在这里插入图片描述
运行结果:
在这里插入图片描述
该错误是由于子组件直接修改了传入的 prop 数据 count,而在 Vue 中,props 是只读的,不能在子组件中直接修改。这导致 ESLint 报错,提示 “Unexpected mutation of ‘count’ prop”。

【优化】
在这里插入图片描述
【解析】

  • 在父组件中,count 是父组件的状态,子组件通过 props 接收到 count
  • 当点击 +- 按钮时,子组件更新 count(通过 handleAddhandleSub),但由于 props 是只读的,子组件不能直接修改它。
  • 于是,子组件通过 this.$emit('changeCount', newCount) 向父组件发送事件,告诉父组件新的 count 值。
  • 父组件通过监听这个事件 (@changeCount="handleChange") 来接收新值,并通过 handleChange(newCount) 方法更新父组件的 count 数据。
  • 更新后的 count 会通过 props 传递到子组件,形成一个新的数据流,子组件会重新渲染,显示最新的 count 值。

运行结果:

减1:
在这里插入图片描述
加1:
在这里插入图片描述

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

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

相关文章

不仅能够实现前后场的简单互动,而且能够实现人机结合,最终实现整个巡检流程的标准化的智慧园区开源了

智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。充分利用现有…

利用正则表达式批量修改文件名

首先&#xff0c; 我们需要稍微学习一下正则表达式的使用方式&#xff0c;可以看这里&#xff1a;Notepad正则表达式使用方法_notepad正则匹配-CSDN博客 经过初步学习之后&#xff0c;比较重要的内容我做如下转载&#xff1a; 元字符是正则表达式的基本构成单位&#xff0c;它们…

【 LLM论文日更|检索增强:大型语言模型是强大的零样本检索器 】

论文&#xff1a;https://aclanthology.org/2024.findings-acl.943.pdf代码&#xff1a;GitHub - taoshen58/LameR机构&#xff1a;悉尼科技大学 & 微软 & 阿姆斯特丹大学 & 马里兰大学领域&#xff1a;retrieval & llm发表&#xff1a;ACL2024 研究背景 研究…

驾校增加无人机培训项目可行性技术分析

驾校增加无人机培训项目的可行性技术分析&#xff0c;需要从市场需求、技术基础、政策支持、培训体系构建及运营等多个维度进行综合考量。以下是对这些方面的详细分析&#xff1a; 一、市场需求分析 1. 行业应用广泛&#xff1a;无人机在航拍、农业、环境监测、地理测绘、电力…

MFC1(note)

引言 在学习SDK后我们发现&#xff0c;写消息好麻烦&#xff0c;处理消息更麻烦 处理消息效率低发送消息效率低 所以把SDK中这些消息全部封装好 MFC封装了windows 的大部分API 这里说一下QT架构跨平台 MFC用得如何取决于你SDK的水平 创建 如果打开没有MFC 一般勾选以下…

OpenCV3.4.0 添加contrib模块过程记录

一 准备文件 下载这些文件&#xff0c;可以从GitHub/Gitee很容易找到&#xff1a; source-3.4.0.zip 源文件opencv_3rdparty-ffmpeg-master_20171009 opencv_3rdparty-ippicv-master_20170822 opencv_contrib-3.4.0.zip …

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中

发现了一些恶意软件样本&#xff0c;这些样本据信与朝鲜民主主义人民共和国 (DPRK)&#xff08;又称北朝鲜&#xff09;有关&#xff0c;这些样本使用 Flutter 构建&#xff0c;Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理&#xff0c;以帮助保护…

论文学习——一种基于决策变量分类的动态约束多目标进化算法

论文题目&#xff1a; A dynamic constrained multiobjective evolutionary algorithm based on decision variable classification 一种基于决策变量分类的动态约束多目标进化算法&#xff08;Yinan Guo a,b, Mingyi Huang a, Guoyu Chen a,*, Dunwei Gong c, Jing Liang d, …

基于微信小程序的高校实习管理系统设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

【UE5】在材质Custom写函数的方法

UE材质的Custom本身会构建为函数&#xff0c;所以并不能在Custom定义函数&#xff0c;但当然还是有办法的 总结一些在custom写函数的方法 常规办法 常规办法就是使用结构体作为函数使用 以一个Lerp功能函数演示 让我们看看写法&#xff1a; struct VolBlendFunc //定义结…

Springboot如何打包部署服务器

文章目的&#xff1a;java项目打包成jar包或war包&#xff0c; 放在服务器上去运行 一、编写打包配置 1. pom.xml 在项目中的pom.xml文件里面修改<build>...</build>的代码 >> 简单打包成Jar形式&#xff0c;参考示例&#xff1a; <build><fina…

CDA LEVEL 2考试大纲

​编辑返回首页 CDA LEVELⅡ考试大纲 一、总体目标 CDA&#xff08;Certified Data Analyst&#xff09;&#xff0c;即“CDA 数据分析师”&#xff0c;是在数字经济大背景和人工智能时代趋势下&#xff0c;面向全行业的专业权威国际资格认证&#xff0c;旨在提升全球用户数…

基于STM32的智能家居系统:MQTT、AT指令、TCP\HTTP、IIC技术

一、项目概述 随着智能家居技术的不断发展&#xff0c;越来越多的家庭开始使用智能设备来提升生活质量和居住安全性。智能家居系统不仅提供了便利的生活方式&#xff0c;还能有效地监测家庭环境&#xff0c;保障家庭安全。本项目以设计一种基于STM32单片机的智能家居系统为目标…

微信小程序-prettier 格式化

一.安装prettier插件 二.配置开发者工具的设置 配置如下代码在setting.json里&#xff1a; "editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml"…

3D编辑器教程:如何实现3D模型多材质定制效果?

想要实现下图这样的产品DIY定制效果&#xff0c;该如何实现&#xff1f; 可以使用51建模网线上3D编辑器的材质替换功能&#xff0c;为产品3D模型每个部位添加多套材质贴图&#xff0c;从而让3D模型在展示时实现DIY定制效果。 具体操作流程如下&#xff1a; 第1步&#xff1a;上…

SQL集合运算

集合论是SQL语言的根基。 1 集合运算 注意事项&#xff1a; 1&#xff09;SQL能操作具有重复行的集合&#xff0c;可以通过可选项ALL来支持。 如果直接使用UNION或INTERSECT&#xff0c;结果里不会出现重复的行。如果想在结果里留下重复行&#xff0c;可以加上可选项ALL。写…

【PGCCC】Postgresql 存储设计

架构图 用户查询指定 page 的数据 首先查询该 page 是否在缓存中&#xff0c;通过 hash table 快速查找它在缓存池的位置 如果存在&#xff0c;那么从缓存池读取返回 如果不存在需要从磁盘读取数据&#xff0c;并且放入到缓存池中&#xff0c;然后返回 postgresql 存储单位 …

CTFHub每日练习

文章目录 技能树CTF Web信息泄露目录遍历PHPINFO备份文件下载网站源码bak文件vim缓存.DS_Store Git泄露Logstash index方法一方法二 密码口令弱口令 技能树 CTF Web 信息泄露 目录遍历 PHPINFO 备份文件下载 网站源码 当开发人员在线上环境中对源代码进行了备份操作&#x…

pycharm分支提交操作

一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url&#xff0c;选择自己的项目路径 3、点击Clone&#xff0c;就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支&#xff08;非必要可以不使用&#xf…

SkyWalking-安装

SkyWalking-简单介绍 是一个开源的分布式追踪系统&#xff0c;用于检测、诊断和优化分布式系统的功能。 支持 ElasticSearch、H2、MySQL、PostgreSql 等数据库 基于 ElasticSearch 的情况 ElasticSearch&#xff08;ES&#xff09; 安装 1、下载并解压 https://www.elastic…