当前位置: 首页 > article >正文

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

在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.kler.cn/a/317865.html

相关文章:

  • 计算机网络(3)网络拓扑和IP地址,MAC地址,端口地址详解
  • 【p2p、分布式,区块链笔记 DAM】GUN/SEA(Security, Encryption, Authorization) 模块genkey
  • Java 堆内存管理详解:`-Xms` 和 `-Xmx` 参数的使用与默认内存设置
  • DHCP与FTP
  • Debezium日常分享系列之:异步 Debezium 嵌入式引擎
  • git之 revert和rebase
  • 【树莓派】python3程序获取CPU和GPU温度
  • 无人机之战斗机的详解!
  • 单片机学到什么程度才可以去工作?
  • WebGL纹理与材质
  • 【C++二叉树】236.二叉树的最近公共祖先
  • 使用three.js+vue3完成无人机上下运动
  • 汽车售后诊断ECU参数分析
  • 寄宿制学校自闭症教育:为每个孩子创造奇迹
  • spring boot项目对接人大金仓
  • 线性代数学习笔记~
  • 初识JavaScript
  • 【图像压缩与重构】基于BP神经网络
  • 新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)
  • python request库的使用
  • 深度学习领域相关的专业术语(附带音标解释)
  • EtherCAT转Profient协议网关简述
  • MySQL函数及存储过程
  • 视频制作软件哪个好?前十名推荐!
  • 云手机的便捷性和安全性体现在哪?
  • redisson 延迟队列实现任务过期监听