vue-组件通信(动态组件)

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来vue篇专栏内容:vue-组件通信|动态组件

目录

组件通信

1.父传子

2.子传父

3.ref

4.兄弟组件

5.跨层级 provide、inject

动态组件

插槽

1.匿名插槽

2.具名插槽

3.作用域插槽

组件通信

在MVVM框架中,每个组件的数据都具有私有性,即默认情况下,组件自身的数据只允许在本组件内部供自己使用。但实际开发中,我们经常会需要将某些组件的数据对其它组件开放访问,此时就需要使用合适的通信方式来实现数据共享了,Vue框架中支持以下数据通信方式:

  • 父传子

  • 子传父

  • 兄弟通信

  • 非常深的层级的父子/子父关系等特殊关系 跨层级

1.父传子

为了便于理解父传子子传父,在理解时,可以寻求一下两种方式的切入点

即将父组件中的数据传递给子组件。Vue中父传子是借助props来进行传递的。具体实现思路是:

  • 父组件将数据以属性的方式绑定在子组件标签上

  • 子组件通过props属性进行接收,props支持两种书写形式:

    • 数组形式,书写简单,但不支持类型与默认值约束

    • 对象形式,书写复杂,但支持类型与默认值约束

在子组件收到props数据后,即可将数据当做自身的数据来使用,使用方法参照使用data数据的方式来即可。

请注意,props是单向数据流向的只读属性,不能在子组件中进行对其修改。

2.子传父

即将子组件中的数据传递给父组件。Vue中子传父是借助$emit/$on操作自定义事件实现的。具体实现思路是:

  • 在子组件中触发一个自定义事件,将需给父的数据以参数的形式传递给自定义事件

  • 父组件在子组件标签上监听刚才触发的自定义事件,并且定义事件处理程序,在事件处理程序中以形参的方式接收来子组件的数据

  • 如果需要保存来自子组件的数据,可以在回调函数中将来自子组件的数据保存到自身的data中

3.ref

子传父(父去拿子的数据)情况类似,形式与this.$children也是非常像的,可以看作ref是this.$children的完美替代方案。通过ref获取子节点实例的时候是不要获取子组件实例对应的索引。

ref属性被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用ref属性,则引用指向的就是 DOM 元素;如果ref属性用在子组件上,引用就指向子组件实例

<template><div><!-- ref:1. ref用于在父组件中去获取子组件/元素的对象2. 如果获取的子元素是一个组件,则获取到的对象是子组件实例3. 如果获取的子元素是一个普通的html标签,则获取到的对象是标签对应的dom对象4. 语法:a. 只需要给对应的元素绑定一个ref属性即可(属性值不能重名)b. 通过 this.$refs.属性值 来进行获取这里的this.$refs其实就是当前组件自身已经绑定的ref属性对象集合,对象属性名就是刚才通过ref属性绑定的属性值c. 通过对应的属性名来获取对应的对象5. 该套路与react后续的ref操作一致,区别在ref属性值,vue中我们可以直接写属性值,而react里属性值需要通过createRef()   useRef()等方法来创建--><div ref="refDiv1">父组件</div><div ref="refDiv2">今天是2月的最后1天,明天就是3月份</div><Child ref="refChild"></Child>
​<button @click="getData">获取</button></div>
</template>
​
<script>
import Child from "./Child.vue"
export default {components: {Child,},methods: {getData(){console.log(this.$refs);// 元素对应的dom获取console.log(this.$refs.refDiv1);console.log(this.$refs.refDiv2);// 元素对应的dom属性this.$refs.refDiv1.innerHTML = "0942"// 元素对应的实例获取console.log(this.$refs.refChild);// 元素对应的实例上属性console.log(this.$refs.refChild.date);// 元素对应的实例上的方法console.log(this.$refs.refChild.getDate());}}
}
</script>
​
<style></style>
4.兄弟组件

又称eventBus中央事件总线

事件中心

核心步骤

  • 建立事件中心

    • const eventBus = new Vue()
  • 传递数据

    • eventBus.$emit('自定义事件名',传递的数据)
  • 接收数据

    • eventBus.$on('自定义事件名'[,callback])
  • 销毁事件中心

    • eventBus.$off('自定义事件名')

案例:互相伤害,具体代码实现可以查看本节对应的代码文件

通过组件模拟俩个角色,赋予组件角色名称、生命值、攻击力,给每个组件一个按钮,点击按钮实现攻击对方,发动攻击后需要扣减对方生命值,当任意一方生命值为0时,游戏结束。

  • 先将eventBus全局化(写在main.js中)

    • 思路:将需要全局化的数据挂载到Vue的原型上

    • // 将数据全局化 const eventBus = new Vue() // 只需要将需要全局化的数据放到Vue的原型上 Vue.prototype.$eventBus = eventBus

  • 后续按照上面的语法使用即可

5.跨层级 provide、inject

组件通信方式:

1、父传子 props、$parent

2、子传父 自定义事件 $emit 、$children、$refs

3、兄弟 eventbus $emit $on $off

4、跨层级 provider inject 依赖注入 $root

5、组件共享工具 vuex pinia

动态组件

通过使用保留的 <component>元素,动态地绑定到它的is 特性,==我们让多个组件可以使用同一个挂载点(位置),并动态切换。==

语法:

<component :is="默认渲染的组件名"/>

场景:当我们希望实现tab选项卡切换的效果的时候就可以使用动态组件

案例:使用动态组件实现简易的步骤向导效果

简单步骤向导效果

插槽

插槽也是组件传值的一种方式。

组件的最大特性就是重用,而用好插槽能大大提高组件的可重用能力。

小霸王

通俗的来讲,插槽无非就是在子组件中挖个坑,坑里面放什么东西由父组件决定。

插槽类型有:

  • 单个(匿名)插槽

  • 具名插槽

  • 作用域插槽

插槽标签:<slot></slot>

1.匿名插槽

简单来讲就是没有名字的插槽,在组件使用过程中,一个子组件中只能具备一个匿名插槽。

步骤

  • 父组件通过在子组件标签之间写内容

  • 子组件通过插槽获取父写的内容

父组件

<div><Child>{{thing}}</Child><Child>用户名不能为空</Child><Child>用户名已经被使用</Child><Child>密码输入不一致</Child>
</div>

子组件

<div class="warn">错误:<slot></slot>
</div>
2.具名插槽

与匿名插槽非常的像,区别在于具名插槽是具有名字的插槽,与匿名相比多了个名字而已。

步骤

  • 子组件通过预留slot标签来挖坑,但是这里插槽有名字(只需要给slot标签name属性即可)

    • name值在当前范围内要唯一

    • 可以存在多个具名插槽

    • 同时也可以存在匿名插槽,匿名插槽只能有一个

  • 父组件需要去填坑,父组件写在子组件标签之间的元素也需要存在多个,每个元素上需要有绑定到的插槽的名字(通过slot="名"形式进行指定)

  • 如果元素没有名字则绑定到对应的匿名插槽上,如果子组件没有匿名插槽则数据丢弃

3.作用域插槽

应用场景:父组件对子组件的内容进行加工处理

作用域插槽是一种特殊类型的插槽,作用域插槽会绑定了一套数据,父组件可以拿这些数据来用,于是,情况就变成了这样:样式父组件说了算,但父组件中内容可以显示子组件插槽绑定的数据。

简单来讲:子也可以往坑里放数据,让父组件去拿(子→父)

示例代码

==父组件==<template><div><!-- 作用域插槽:1. 三个插槽中最难理解的一个2. 作用:子-父3. 子组件如果需要把数据往坑里放,需要将数据以属性值的形式放在slot标签上,属性值可以多个,但是名不能用name4. 父需要给子组件标签里加一个元素,元素现在一般是div(理论上讲任意标签都行),给div加上slot-scope属性,值一般是props5. 第4步中的props就是第3步中绑定的那些数据的集合(对象形式)
​6. slot-scope属性所在标签上面不能再有其它的标签,必须是子组件标签--><Child :uname="name"><div slot-scope="props"><div><button @click="changeName(props.newname)">修改名字</button></div></div></Child></div>
</template>
​
<script>
import Child from "./Child.vue"
export default {data() {return {name: "牛牛",}},components: {Child,},methods: {changeName(name) {this.name = name},},
}
</script>
​
<style></style>

==子组件==

<template><div><div>勇敢{{ uname }},不怕困难。</div><!-- <button @click="changeName">修改名字</button> --><slot :newname="newname"></slot></div>
</template>
​
<script>
export default {data() {return {newname: "牛牛",}},props: {uname: {type: String,},},// methods: {//     changeName() {//         this.uname = this.newname//     },// },
}
</script>
​
<style></style>
​

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

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

相关文章

Xilinx Zynq 7000系列中端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供5套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

【JavaEE】Servlet(创建Maven、引入依赖、创建目录、编写及打包、部署和验证、smart Tomcat)

一、什么是Servlet&#xff1f; Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app 1.1 Servlet能干什么&#xff1f; &#x1f695;允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类…

P3371 【模板】单源最短路径(弱化版)

【模板】单源最短路径&#xff08;弱化版&#xff09; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到所有点的最短路…

Kotlin基础——接口和类

接口 使用 : 表示继承关系&#xff0c;只能继承一个类&#xff0c;但可以实现多个接口override修饰符表示重写可以有默认方法&#xff0c;若父类的默认方法冲突&#xff0c;则需要子类重写&#xff0c;使用super<XXX>.xxx()调用某一父类方法 interface Focusable {fun …

SQL学习之增删改查

文章目录 数据库数据类型建表create table插入数据insert into查询数据select from修改数据update set删除数据delete from备份ctas结果插入iis截断表 truncate table修改表结构alter table添加注释 注&#xff1a;本文的SQL语法是基于Oracle数据库操作的&#xff0c;但是基本的…

开源软件 FFmpeg 生成模型使用图片数据集

本篇文章聊聊&#xff0c;成就了无数视频软件公司、无数在线视频网站、无数 CDN 云服务厂商的开源软件 ffmpeg。 分享下如何使用它将各种视频或电影文件&#xff0c;转换成上万张图片数据集、壁纸集合&#xff0c;来让下一篇文章中的模型程序“有米下锅”&#xff0c;这个方法…

⑨【MySQL事务】事务开启、提交、回滚,事务特性ACID,脏读、幻读、不可重复读。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL事务 ⑨【事务】1. 事务概述2. 操作事务3…

若依Linux与Docker集群部署

若依Linux集群部署 1. 若依2.MYSQL Linux环境安装2.1 MYSQL数据库部署和安装2.2 解压MYSQL安装包2.3 创建MYSQL⽤户和⽤户组2.4 修改MYSQL⽬录的归属⽤户2.5 准备MYSQL的配置⽂件2.6 正式开始安装MYSQL2.7 复制启动脚本到资源⽬录2.8 设置MYSQL系统服务并开启⾃启2.9 启动MYSQL…

ubuntu小技巧30--23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer

ubuntu小技巧30-- 23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer 介绍解決方法说明 介绍 近期在电脑上安装了 ubuntu 23.10桌面版本, 安装最新版钉钉后无法正常打开软件&#xff0c;报错 undefined symbol: FT_Get_Color_Glyph_Layer &#xff0c;具…

手把手带你学习 JavaScript 的 ES6 ~ ESn

文章目录 一、引言二、了解 ES6~ESn 的新特性三、掌握 ES6~ESn 的用法和实现原理四、深入挖掘和拓展《深入理解现代JavaScript》编辑推荐内容简介作者简介精彩书评目录 一、引言 JavaScript 是一种广泛使用的网络编程语言&#xff0c;它在前端开发中扮演着重要角色。随着时间的…

基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境OpenCV环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于从网络获取的多种银行卡数据集&#xff0c;采用OpenCV库的函数进行图像处理&#xff0c;并通过神经网络进行模型训练。最终实…

6.jvm中对象创建流程与内存分配

目录 概述对象的创建流程对象的内存分配方式对象怎样才会进入老年代大对象直接进入老年代内存担保 jvc 相关指令查看jdk默认使用的gc查看当前jdk支持的有哪些gc查看指定进程当前正在使用的gc 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm基本知识地址jvm类加载系…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大&#xff0c;静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因&#xff0c;选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时&#xff0c;如果CDN节…

算不上最全,但都是必备——Spring这些不会不行啊

Spring 篇 Spring框架中的单例bean是线程安全的吗&#xff1f; 不是线程安全的 Spring bean并没有可变的状态(比如Service类和DAO类)&#xff0c;所以在某种程度上说Spring的单例bean是线程安全的。 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录&#xff0c;鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile &#xff0c;添加环境变量&#xff0c;php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

基于Rabbitmq和Redis的延迟消息实现

1 基于Rabbitmq延迟消息实现 支付时间设置为30&#xff0c;未支付的消息会积压在mq中&#xff0c;给mq带来巨大压力。我们可以利用Rabbitmq的延迟队列插件实现消息前一分钟尽快处理 1.1定义延迟消息实体 由于我们要多次发送延迟消息&#xff0c;因此需要先定义一个记录消息…

2.6 Windows驱动开发:使用IO与DPC定时器

本章将继续探索驱动开发中的基础部分&#xff0c;定时器在内核中同样很常用&#xff0c;在内核中定时器可以使用两种&#xff0c;即IO定时器&#xff0c;以及DPC定时器&#xff0c;一般来说IO定时器是DDK中提供的一种&#xff0c;该定时器可以为间隔为N秒做定时&#xff0c;但如…

RedCap推动5G规模应用,紫光展锐赋能产业高质量发展

5G R17 RedCap作为面向中高速物联网场景的关键技术和解决方案&#xff0c;可以大幅降低终端的复杂度、成本和功耗。在当前国内5G应用规模化发展关键时期&#xff0c;5G R17 RedCap拥有广大的市场潜力与广泛的应用场景&#xff0c;将有助于推动5G规模应用、构建融通发展的5G生态…

【C++】join ()和detach ()函数详解和示例

简单的来说&#xff0c;join ()方法建立的线程具有阻碍作用&#xff0c;该线程不结束&#xff0c;另一些函数就无法运行。detach ()方法建立的线程&#xff0c;可以和另一些函数同时进行。下面以示例进行详细说明&#xff0c;以帮助大家理解和使用。 目录 join ()detach () jo…

PHP使用文件缓存实现html静态化

<?php // 动态生成的内容 $content "<html><body><h1>time:".date("Y-m-d H:i:s")."</h1></body></html>"; // 静态文件保存路径和文件名 $staticFilePath "file.html"; if(file_exists($s…