Vue3中组件通讯的方式

Vue3中组件通讯的方式

1 🤖GPT🤖: (答案有点问题混淆了vue2的内容)

父组件向子组件传递数据

  1. props 子组件通过 props 属性从父组件接收数据。
  2. emit事件子组件通过emit 事件 子组件通过 emit事件子组件通过emit 发射事件向父组件发送消息。
  3. provide / inject 父组件通过 provide 提供数据,子组件通过 inject 注入数据。
  4. ref 父组件通过 ref 获取子组件实例,然后调用子组件的方法。
  5. Slots 在父组件中使用Slots向子组件传递内容,子组件可以通过$slots来获取这些内容,并将它们渲染到自己的视图中。

子组件向父组件传递数据

emit事件使用emit 事件 使用 emit事件使用emit 发射事件,父组件通过 v-on 监听该事件。
provide/inject 子组件通过 inject 注入父组件提供的数据,然后触发 Action 修改该数据,父组件的数据也就变了。
Ref 父组件通过 ref 获取子组件的实例,子组件调用 ref 内容,父组件监听其变化。
Vuex 使用 Vuex 管理共享状态,子组件通过 mutation 或 action 修改状态,父组件监听状态变化。
Event Bus 利用 Vue 的实例作为 EventBus ,子组件通过 Bus.$emit 触发事件,父组件监听该事件的变化。

兄弟组件之间的数据传递

EventBus 可以使用EventBus来创建一个全局的事件总线,从而在兄弟组件之间进行数据传递。通过在兄弟组件中使用emit和emit和emit和on来触发和监听事件,从而实现数据的传递。
Provide 和 Inject Vue 3中的Provide和Inject API也可以用于兄弟组件之间的数据传递,可以通过在父组件中使用Provide来提供数据,然后在兄弟组件中使用Inject来获取这些数据,从而实现兄弟组件之间的数据传递。
Vuex Vuex是Vue 3中的状态管理库,可以用于管理全局的数据状态,从而实现兄弟组件之间的数据传递。
在这里插入图片描述

父组件向子组件传递数据:(父传子)

1. props:

逐级透传

父组件

<template><ChildComponent  :msg="message" />
</template>
<script setup> const message = 'hello'
</script>

子组件:

<template><p>{{ msg }}</p> 
</template><script setup>defineProps(['msg'])
</script>

2. provide/inject

跨级共享

provide(提供): 父组件中注册,传递给后代组件的数据对象
inject( 注入):后代组件中接收父组件提供的数据对象

父组件 Root.vue

<template><div><Footer/></div>
</template>
<script setup>import { ref,provide } from 'vue'import Footer from './Footer.vue' //导入子组件Footer//父组件中注册给共享后代组件的信息provide(/* 注入名 */ 'mgs', /* 值 */ '父组件信息!')  
</script>

子组件 Footer.vue

<template><DeepChild/>
</template>
<script setup>
import DeepChild from './DeepChild.vue' //导入子组件Footer
//在子组件Footer中可以不需要接收父组件Root共享的数据,在后代组件中,直接接收,实现跨级传递
</script>

子孙组件DeepChild.vue

不需要父组件Footer传递,就能跨级获取祖先组件Root传递的数据

<template><div>{{ msg }}</div>
</template>
<script setup>import { inject } from 'vue'const msg = inject('msg') //跨级接收祖先组件的共享的信息console.log(msg) //父组件信息
</script>

父组件向子组件传递信息,如果是多层组件嵌套(父>子>孙>孙孙…) ,props逐级透传十分麻烦,props可用但不优雅,更推荐 provide/inject依赖注入的方式;
provide/inject依赖注入中父组件向后代组件通讯,如果说props是传递,逐级透传的,那么依赖注入更准确来说是在父组件中与后代组件共享数据,可实现跨级共享;

3. 透传 Attributes(非props和非emit)

“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id

作用: 在父组件标签上声明的参数/事件监听,会透传到子组件中

3.1 Attributes透传参数

父组件

<!-- 透传参数class到子组件中 -->
<MyButton class="large" />

子组件 MyButton.vue

<button>click me</button>

最终渲染的html标签

<button class="btn large">click me</button>
3.2 Attributes透传事件监听(有点像冒泡事件)

父组件

 <!-- 透传参数class到子组件中 --><MyButton @click="onClick1"  /><script setup>import  MyButton from './MyButton.vue'const onClick = ()=>{cosole.log("透传事件监听,从父组件触发")}</script>

子组件 MyButton.vue

<button @click ="onClick2">click me</button>

当点击子组件的按钮时:
父组件的onClick1 和子组件的onClick2 都触发

3.3 useAttrs 像defineProps获取透传Attributes

父组件

<!-- 透传参数ms到子组件中 -->
<Child  msg="父组件中传递数据"  /><script setup>import  Child from './child.vue'
</script>

子组件child.vue

 <script setup>
import { useAttrs } from 'vue'
//useAttrs像defineProps获取透传Attributes
const attrs = useAttrs()
cosole.log(attrs.msg) //父组件中传递数据
</script>

4. slot 插槽

父组件向子组件指定位置插入html内容渲染

4.1 默认插槽(传递html/组件)

父组件

<template><Child><div>插入的html,将会在子组件中指定slot的位置渲染出来</div></Child>
</template>

子组件

<template><slot><slot/>
</template>
4.2 具名插槽(父->子)

当需要渲染不同的内容时,默认插槽显然不够用,需要按插槽的name名进行区别渲染

父组件

#XX == v-slot:XX 这2个写法都是插槽name名在父组件的写法

<><template #XX1> 插槽1 </template><template v-slot:XX2>插槽2</template>
</>

子组件

<template><slot name="XX1"><slot/><slot name="XX2"><slot/>  
</template>
4.3 作用域插槽 (子>父)

作用插槽分为: 默认作用域插槽和 具名作用域插槽
elementUI中table组件插入按钮就是使用了默认作用域插槽

4.3.1. 默认作用域插槽: v-slot:defalut = #defalut = v-slot

父组件

<><template #default="slotProps">{{slotProps.XX}}</template>
</>

子组件

<slot :XX="子组件数据"></slot>
4.3.2. 具名作用域插槽

父组件

 <><template #slotName="slotProps">{{slotProps.XX}}</template>
</>

子组件

<slot name="slotName"  :XX="子组件数据"></slot>

Element-PlusUI组件框架中table组件

table组件中就用到了作用域插槽

<el-table :data="tableData" style="width: 100%" max-height="250"><el-table-column fixed prop="date" label="Date" width="150" /><el-table-column fixed="right" label="Operations" width="120"><template #default="scope">{{scope.row.date}}</template></el-table-column>
</el-table>

子组件向父组件传递数据:(子传父)

1.组件事件emit

父组件中v-on(简写@)监听
子组件中$emit触发

父组件

父组件中v-on(简写@)监听

 <template><child @some-event="callback" />
</template>
<script setup>
import child from './child.vue'
const callback = (target) => {console.log('父组件-callback ')console.log(target) //子组件传递的数据
}
</script>

子组件

子组件中$emit触发

 <templete><!-->在templete中使用$emit触发,不需要defineEmits声明</-->    <button @click="$emit('someEvent', '子组件传递的数据')">click me</button>  <!-->触发方法中的emit,需要defineEmits声明</-->      <button @click="buttonClick()">click me</button>  
</templete><script setup>
//setup语法糖中显示声明emit    
const emit = defineEmits(['someEvent'])
function buttonClick() {//触发emit  emit('someEvent', '子组件传递的数据')
}
</script>

2. defineExpose/ ref

子组件中通过defineExpose向外暴露数据或方法
父组件中通过ref获取子组件暴露的数据或调用子组件的方法

父组件

在父组件中需要声明子组件的ref, 如:const childRef = ref()

 <template><child ref="childRef" />
</template>
<script setup>
import { ref, onMounted } from 'vue'
// 引入子组件
import child from './child.vue'const childRef = ref()
onMounted(() => {console.log(childRef.value.data1) // 子组件数据childRef.value.fn() // 子组件中的方法
})
</script>

子组件

子组件中通过defineExpose向外暴露数据或方法

 <script setup>
import { ref } from 'vue'
const data1 = ref('子组件数据')
const fn = () => {console.log('子组件中的方法')
}
//通过defineExpose向外暴露数据或方法
defineExpose({data1,fn
})
</script>

跨组件通讯-全局状态共享(状态管理库): Vuex /Pinia

在Vue3已经逐渐用Pinia这个菠萝替代Vuex了

Pinia,官方文档描述:符合直觉的 Vue.js 状态管理库 hook的写法!
其实Pinia的官方文档就写得很清楚了:🛬🛬🛬🛬🛬🛬🛬🛬🛬🛬🛬🛬为什么你应该使用 Pinia?

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

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

相关文章

Java SpringCloud gateway面试题

Java SpringCloud gateway面试题 前言1、什么是网关Zuul&#xff08;gateway&#xff09;&#xff1f;2、服务网关的作用&#xff1f;3、Zuul网关(Gateway)如何搭建集群&#xff1f;4、ZuulFilter常用有那些方法&#xff1f;5、如何实现动态zuul网关路由转发&#xff1f;6、在Z…

kubeadm安装部署

目录 1.要求 2.环境准备 3.所有节点安装docker 4.所有节点安装kubeadm&#xff0c;kubelet和kubectl 5.部署K8S集群 6.测试 7.扩展3个副本 8.部署Dashboard master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&#xff09;192.168.27.10docker、kubeadm、kubelet、…

LightDB - ecpg 支持dml 中使用 return into 【24.1】

在之前的版本中ecpg 中只能使用returning into 来给c 变量赋值&#xff0c;如下&#xff1a; exec sql update t1 set c aa where id 2 returning c into :c_val;为了兼容oracle pro*c 中return into 的用法&#xff0c;从24.1 开始&#xff0c; LightDB 也支持通过return in…

Chrome插件 | WEB 网页数据采集和爬虫程序

无边无形的互联网遍地是数据&#xff0c;品类丰富、格式繁多&#xff0c;包罗万象。数据采集&#xff0c;或说抓取&#xff0c;就是把分散各处的内容&#xff0c;通过各种方式汇聚一堂&#xff0c;是个有讲究要思考的体力活。君子爱数&#xff0c;取之有道&#xff0c;得注意遵…

mobile app 安全扫描工具MobSF了解下

可以干啥&#xff1a; static 静态分析 dynamic 动态分析 可以用来渗透了 如何docker安装 docker image 下载地址https://hub.docker.com/r/opensecurity/mobile-security-framework-mobsf/ setup 两行即可 1 docker pull opensecurity/mobile-security-framework-mobsf…

关于VScode远程编写linux SHELL的报错处理

使用vscode远程编写linux保存shell时&#xff0c;提示报错&#xff1a; 未能保存“shell”: 无法写入文件"vscode-remote:.../tmp/shell"(NoPermissions (FileSystemError): Error: EACCES: permission denied, open /tmp/shell) 大体意思是说&#xff1a;权限被拒…

Python | 从子目录文件导入父目录模块的方法

问题描述 我有两级目录&#xff0c;第一级称为parent_dir&#xff0c;第二级称为child_dir。现在在child_dir下&#xff0c;有一个py&#xff0c;称为child.py&#xff0c;在parent_dir下&#xff0c;也有一个py&#xff0c;称为parent.py。 我想从child.py中导入parent.py中…

Go Slice的底层实现原理深度解析

文章目录 切片的诞生&#xff1a;数组的延伸切片的结构初始化切片 切片的内存管理扩容机制 实例分析&#xff1a;切片的动态特性切片与性能性能对比 切片的并发安全并发场景下的切片操作 切片与接口切片与空接口 切片的遍历与操作遍历切片切片的切片操作 切片的垃圾回收切片的生…

年轻人怎么搞钱?

年轻人想要搞钱&#xff0c;可以考虑以下几个方面&#xff1a; 1. 创业&#xff1a;年轻人可以通过自己的创意&#xff0c;找到一个市场的空缺&#xff0c;开创自己的业务。可以从比较小的项目开始&#xff0c;逐渐扩大范围&#xff0c;积累经验和财富。 2. 投资&#xff1a;…

成为大佬之路--linux软件安装使用第000000021篇--linux安装docker

简介 Docker 是一个开源项目&#xff0c;诞生于 2013 年初&#xff0c;最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会&#xff0c;遵从了 Apache 2.0 协议&#xff0c;项目代码在 [GitHub](https://github.co…

Hadoop之HDFS——【模块二】数据管理

一、Namespace的概述 1.1.集群与命名空间的关系 类似于大集群与小集群之间的关系,彼此之间独立又相互依存。每个namespace彼此独立,Namespace工作时只负责维护本区域的数据,同时所有的namespace维护的文件都可以共用DataNode节点,为了区分数据属于哪些Namespace,DataNode…

强大而灵活的python装饰器

装饰器&#xff08;Decorators&#xff09; 一、概述 在Python中&#xff0c;装饰器是一种特殊类型的函数&#xff0c;它允许我们修改或增强其他函数的功能&#xff0c;而无需修改其源代码。装饰器在函数定义之后立即调用&#xff0c;并以函数对象作为参数。装饰器返回一个新…

力扣151--反转字符串中的单词(优)

清晰易懂&#xff0c;简单高效&#xff01; 大体思路&#xff1a; 每次截取到想要的单词&#xff0c;拼接到新的sb中&#xff0c;过程中伴随双指针进行空格位置指向控制&#xff0c; 其中如果start指针如果0的情况要放在第一个判断条件防止边界条件失效&#xff0c;并且这种…

Linux系统运维脚本:shell脚本查看一定网段范围在线网络设备的ip地址和不在线的网络设备的数量(查看在线和不在线网络设备)

目 录 一、需求说明 二、解决方案 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;方案 三、脚本程序实现 &#xff08;一&#xff09;脚本代码和解释 1、脚本代码 2、代码解释 &#xff08;二&#xff09;脚本验证 1、脚本编辑…

CrossOver 24下载-CrossOver 24 for Mac下载 v24.0.0中文永久版

CrossOver 24是一款可以让mac用户能够自由运行和游戏windows游戏软件的虚拟机类应用&#xff0c;虽然能够虚拟windows但是却并不是一款虚拟机&#xff0c;也不需要重启系统或者启动虚拟机&#xff0c;类似于一种能够让mac系统直接运行windows软件的插件。它以其出色的跨平台兼容…

NVMe开发——PCIe复位

简介 PCIe中有4种复位机制&#xff0c;早期的3种被称为传统复位(Conventional Reset)。传统复位中的前2种又称为基本复位(Fundamental Resets)&#xff0c;分别为冷复位(Cold Reset)&#xff0c;暖复位(Warm Reset)。第3种复位为热复位(Hot Reset)。第4种复位被称为功能级复位…

js 正则记录

正则表达式 正则表达式创建一个正则表达式修饰符常用的特殊字符使用正则表达式的方法replace指定字符串作为替换项使用场景&#xff1a;交换字符串中的两个单词将"-"链接的方式改为驼峰式(忽略开头的-)将华氏温度转换为响应的摄氏温度 常用正则示例判断输入是否是正确…

使用docker安装dolphinscheduler

1、前提是安装docker和docker-compose 2、#mkdir /data/dolphinscheduler 3、镜像 docker load -i dolphinscheduler-mysql-driver.tar docker pull zookeeper:3.6.2:3.6.2 docker tag a7 bitnami/zookeeper:3.6.2 理论上postgresql也可以在线pull&#xff0c;但是在线do…

179基于matlab的2D-VMD处理图像

基于matlab的2D-VMD处理图像&#xff0c;将图片进行VMD分解&#xff0c;得到K个子模态图&#xff0c;将每个模态图进行重构&#xff0c;得到近似的原图。可以利用这点进行图像去噪。程序已调通&#xff0c;可直接运行。 179 2D-VMD 图像分解重构 图像处理 (xiaohongshu.com)

每日五道java面试题之spring篇(九)

目录&#xff1a; 第一题. 说一下Spring的事务传播行为第二题. 说一下 spring 的事务隔离&#xff1f;第三题. Spring AOP and AspectJ AOP 有什么区别&#xff1f;AOP 有哪些实现方式&#xff1f;第四题. JDK动态代理和CGLIB动态代理的区别第五题. 解释一下Spring AOP里面的几…