在vue3中,可以使用vue3的API defineExpose()函数结合ref或者$parent,实现父子组件数据的传递。

子组件向父组件传递数据defineExpose()ref

  • 子组件:通过defineExpose() 函数,向外暴露响应式数据或者方法
// src/components/son.vue
<template>
<div>
<h1>儿子有 ${{ son_money }}</h1>
</div>
</template> <script setup lang="ts">
import { ref } from 'vue'; // 1-定义子组件内部的响应式数据
const son_money = ref(500); // 2-定义子组件内部的方法
function queryMoney() {
alert('儿子还有 $' + son_money.value);
} // 3-重点:把子组件中的数据或者方法暴露出去
defineExpose({
son_money,
queryMoney
});
</script>
  • 父组件:通过ref获取子组件实例,进而获取子组件暴露的响应式数据或方法
// src/App.vue
<template>
<div>
<h1>父组件</h1>
<button @click="querySon">看看儿子有多少钱</button>
<button @click="giveSon">给儿子打50块钱</button>
<hr>
<!-- 2-使用子组件 -->
<Son ref="son" />
</div>
</template> <script setup lang="ts">
import { ref } from 'vue';
// 1-引入子组件
import Son from './components/son.vue'; // 3-获取子组件的实例
const son = ref(); function querySon() {
// 4-重点:调用子组件暴露的 queryMoney()方法
son.value.queryMoney();
} function giveSon() {
// 5-重点:查改子组件暴露的数据 son_money
son.value.son_money += 50;
}
</script>

你没看错!这里的ref就是经常用来定义响应式数据的那个ref ,所以在script 标签中使用,需要带上.value

ref 的两个作用:

  • 定义响应式数据
  • 获取子组件实例

父组件向子组件传递数据defineExpose()$parent

  • 父组件:通过defineExpose() 函数,向外暴露响应式数据或者方法
// src/App.vue
<template>
<div>
<h1>父组件有 ${{ money }}</h1>
<hr>
<!-- 2-使用子组件 -->
<Daughter />
</div>
</template> <script setup lang="ts">
import { ref } from 'vue'; // 1-引入子组件
import Daughter from './components/daughter.vue'; // 3-定义父组件响应式数据
const money = ref(1000); // 4-定义父组件里的方法
function borrowMoney() {
money.value -= 100;
return 100;
} // 5-重点:暴露父组件的数据和方法
defineExpose({
money,
borrowMoney
});
</script>
  • 子组件:通过监听事件和$parent ,获取父组件向外暴露的响应式数据或者方法
<template>
<div>
<h1>我是子组件,我有 ${{ dau_money }}</h1>
<!-- 1-重点:通过事件接收 $parent -->
<button @click="borrow($parent)">向父组件借100块</button>
</div>
</template> <script setup lang="ts">
import { ref } from 'vue'; // 定义子组件响应式数据
const dau_money = ref(0); // 2-重点:通过$parent,拿到父组件暴露的数据与方法
function borrow($parent: any) {
// $parent 里就有父组件暴露的 money属性 和 borrowMoney()方法
// console.log($parent); // 3-重点:调用父组件暴露的 borrowMoney()方法
dau_money.value += $parent.borrowMoney();
// 4-重点:可以查改父组件暴露的数据 money
console.log('父组件还有 $' + $parent.money);
}
</script>

vue3探索——使用ref与$parent实现父子组件间通信的更多相关文章

  1. vue之父子组件间通信实例讲解(props、$ref、$emit)

       组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...

  2. Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题

    1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法    父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...

  3. vue:父子组件间通信,父组件调用子组件方法进行校验子组件的表单

    参考: ElementUI多个子组件表单的校验管理:https://www.jianshu.com/p/541d8b18cf95 Vue 子组件调用父组件方法总结:https://juejin.im/ ...

  4. 【Vue】利用父子组件间通信实现一个场景

    组件间通信是组件开发的,我们既希望组件的独立性,数据能互不干扰,又不可避免组件间会有联系和交互. 在vue中,父子组件的关系可以总结为props down,events up: 在vue2.0中废弃了 ...

  5. 【vue】父子组件间通信----传函数

    (一)子组件 调用 父组件 方法 方式一) 子组件中通过this.$parent.event来调用父组件的方法 父组件 <template> <div> <child&g ...

  6. vue非父子组件间通信

    有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的Vue实例作为中央事件总线: 有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的 Vue 实例作为中央事件总线: var bu ...

  7. 【vue】父子组件间通信----传值

    官方文档参考 (一)父组件 向 子组件 传值 ①在父组件中调用子组件处,绑定要传的数据data1, 如 <nav  :data1=" "  ></nav> ...

  8. vue2 父子组件间通信

    父组件往子组件传值 props 传text father.vue <template> <div class="father"> {{'我是父组件'}} & ...

  9. Vue 父子组件间的通信

    前言 在 Vue 项目中父子组件的通信是非常常见的,最近做项目的时候发现对这方面的知识还不怎么熟练,在这边做一下笔记,系统学习一下吧. 1 父组件传值给子组件 1.1 传值写法 父组件传值给子组件,这 ...

  10. 【Vue课堂】Vue.js 父子组件之间通信的十种方式

    这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...

随机推荐

  1. 【Azure 应用服务】更便捷的方式抓取Azure App Service for Windows的网络包

    问题描述 在之前的一篇博文中,介绍了在App Service中抓取网络日志: 抓取Windows的网络包:[应用服务 App Service]App Service中抓取网络日志 抓取Linux的网络 ...

  2. 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?

    问题描述 在Azure Redis的门户活动日志中,可以查看到的是对于Redis资源本身的操作.但是对于客户端连接到Redis服务后,对服务所做出的读写,或删除操作,是否有日志可以查看到呢? 问题回答 ...

  3. Dapr v1.13 版本已发布

    Dapr是一套开源.可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性.微服务.无状态以及有状态等应用程序类型.Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统 ...

  4. .NET Core 的 Docker 容器目录乱码问题

    现象 使用 docker exec -ti <容器名> bash 进入容器,使用 ls 命令列出的数据里面,中文没有正常显示. 原因 就是对应的 Shell 字符集不正确的问题,调整对应的 ...

  5. 选择单词后 按 ctrl + space 单词发音

    需求: 在ide或其他地方,经常有单词发音不是很确定,但并不要很详细 就听个单词发音. 确定快捷键: 左手单手操作,我键盘上貌似就 左边的ctrl和空格键 还没有设定 翻译软件: 使用 pc端的 欧路 ...

  6. 基于ads1299的可穿戴脑电信号采集之性能调试总结

    一 前言 问题背景: 最近做项目,遇到了一个问题,就是采集的信号有噪声,在这里做了很多尝试.   二 测试步骤 A 内部方波信号质量,通过测试发现内部方波信号质量特别好.这个说明了软件和存储这块,没啥 ...

  7. day12-面向对象03

    面向对象03 10.抽象类 abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法:如果修饰类,那么该类就是抽象类 抽象类中可以没有抽象方法,但是有抽象方法的类一定要 ...

  8. [leetcode 496. 下一个更大元素 I] 单调栈

    单调栈的写法: import java.util.ArrayDeque; import java.util.Deque; import java.util.HashMap; import java.u ...

  9. 【UE虚幻引擎】干货!UE修改分辨率的3种方法

    虚幻引擎作为一款实时3D创作工具,在游戏.建筑.影视动画.虚拟仿真等领域受到全球各行各业创作者广泛欢迎,在UE中获取和设置分辨率也是3D创作开发工作中的常用功能.本文介绍了在虚幻引擎中修改分辨率的3种 ...

  10. JQ实现音乐插件并自动播放

    这里分享我最近写出来的一个小东西,基于jq的音乐播放器,可以嵌套到网站 效果截图: 具体首页代码如下: <!DOCTYPE html> <html> <head> ...