Vue3:$refs和$parent实现组件通信

devtools/2024/9/24 20:04:08/

在Vue3中,refs和refs和parent是用于组件间通信的重要机制

一.$refs

1.操作子组件数据

一旦获取到子组件的实例,父组件可以修改子组件暴露的变量值,实现父子组件间的直接数据交换。

2.批量处理子组件

$refs可以用于同时获取多个子组件的实例,从而一次性操作多个子组件的数据,这对于批量更新非常有用。

3.访问DOM元素

除了组件实例,$refs也可以用来获取原生DOM元素的引用,使得开发者可以直接操作DOM元素的属性和方法。

4.组合式API支持

在Vue3的组合式API中,虽然不能直接使用this关键字,但可以通过getCurrentInstance方法来间接获取$refs。

二.parent

1.访问父组件实例

$parent允许子组件直接访问其父组件的实例,这为子组件提供了一种方式来调用父组件的方法或修改父组件的数据。

2.破坏封装性

虽然$parent提供了强大的功能,但它也可能导致组件间的紧耦合,破坏了组件的封装性和复用性。因此,官方推荐使用props和自定义事件来实现父子组件间的通信。

3.defineExpose使用

在Vue3中,为了安全地暴露父组件的数据和方法给子组件,可以使用defineExpose宏,这是一种更可控且类型友好的方式。

4.限制使用场景

由于$parent可能导致代码难以维护和理解,它通常不建议作为首选的通信方式,特别是在大型应用中。

三.使用

1.父组件

2.子组件

四.代码

1.父组件代码

<template><div class="father"><h4>父组件</h4><h4>父亲的房:{{ house }}</h4><button @click="changeCar">修改子的车</button><son ref="s"/></div>
</template><script setup lang="ts" name="father">import { ref } from "vue";import son from "../components/son.vue";let s = ref()let house = ref('檀宫')function changeCar(){s.value.car = '奔驰'}//暴露属性defineExpose({house})</script><style scoped>
.father{background-color: orange;
}
h4{margin-left: 20px;font-size: 20px;
}</style>

2.子组件代码

<template><div class="son"><h4>子组件</h4><h4>子的汽车:{{ car }}</h4><button @click="changeHouse($parent)">传输数据给父</button></div>
</template><script setup lang="ts" name="father">import { ref } from "vue";let car = ref('宝马')function changeHouse(parent:any){parent.house = '汤臣一品'}defineExpose({car})</script><style scoped>
.son{background-color: skyblue;
}
h4{margin-left: 20px;font-size: 20px;
}</style>

五.效果


http://www.ppmy.cn/devtools/116646.html

相关文章

Vue相关

Vue2 组件传递事件&#xff1a; props $emit sync v-model $parent / $children $parent获取父组件的实例&#xff0c;任意调用父组件的方法&#xff0c;修改父组件的数据 ref 父组件获取 子组件 实例&#xff0c;任意调用子组件的方法获取子组件的属性 provide / injectp…

【Linux】环境变量

一、引入环境变量 1.1 引入环境变量 main函数是有参数的&#xff0c;该参数就用来接收命令行参数的。当我们在执行文件的过程中&#xff0c;我们可以输入一些选项。 1.1.1 参数说明 argc&#xff08;argument count&#xff09;&#xff1a;表示命令行参数的数量&#xff0c…

c++ pair

C中的pair是一个模板类&#xff0c;用来存储两个不同类型的对象。它位于<utility>头文件中&#xff0c;并定义在std命名空间中。 pair的定义如下&#xff1a; template <class T1, class T2> struct pair {using first_type T1;using second_type T2;T1 first;…

单片机学到什么程度才可以去工作?

说实话&#xff0c;10几年前&#xff0c;我自学单片机转行的时候&#xff0c;也是一头雾水&#xff0c;也是一边苦苦挣扎&#xff0c;一边迷茫的状态。 硬件、软件、编程...样样都需要学&#xff0c;连从哪儿开始都不知道&#xff0c;每次看到那些密密麻麻的电路图和代码&#…

c语言中“函数指针”

变量有地址&#xff0c;数组有地址&#xff0c;那么函数是否有地址呢&#xff1f; 有 int Add(int x,int y){ return xy; } int main() { pritnf("%p\n",&Add); pritnf("%p\n",Add); //&函数名和函数名都是函数的地址&#xff0c;没…

解决 Ubuntu 18.04 下与 TIFFField 和 Anaconda 冲突导致的库加载问题

在 Ubuntu 18.04 系统上&#xff0c;我在安装完ROS后&#xff0c;启动具有 GUI 的软件&#xff08;如 RViz 和 Gazebo&#xff09;时遇到了一个问题&#xff1a;每次尝试启动这些软件时&#xff0c;终端中都会报错&#xff0c;错误信息类似如下&#xff1a; rviz: relocation …

【资源三号卫星】

资源三号卫星 资源三号卫星&#xff08;ZY-3&#xff09;&#xff0c;作为中国第一颗民用高分辨率光学传输型测绘卫星&#xff0c;于2012年1月9日成功发射&#xff0c;正式拉开了我国在高分辨率对地观测领域自主发展的序幕。以下是对资源三号卫星的详细介绍&#xff1a; 基本…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…