vue3探索——使用ref与$parent实现父子组件间通信

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

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

  • 子组件:通过defineExpose() 函数,向外暴露响应式数据或者方法
javascript 复制代码
// 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获取子组件实例,进而获取子组件暴露的响应式数据或方法
javascript 复制代码
// 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() 函数,向外暴露响应式数据或者方法
javascript 复制代码
// 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 ,获取父组件向外暴露的响应式数据或者方法
javascript 复制代码
<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实现父子组件间通信 - 前端cry - 博客园](https://www.cnblogs.com/cry0-0/p/17680928.html "vue3探索——使用ref与parent实现父子组件间通信 - 前端cry - 博客园")

相关推荐
Never_every993 分钟前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
paopaokaka_luck24 分钟前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖1 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
欣欣之王来了3 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒3 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
计算机魔术师3 小时前
砍半价格、参数再涨,国产旗舰追到 Opus 鼻尖了
前端
paopaokaka_luck3 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
特立独行的猫A3 小时前
10 MB 的桌面 AI 客户端:用仓颉 + 系统 WebView 替代 Electron
前端·harmonyos
修炼的dance4 小时前
白底图存JPG,sharp开mozjpeg背景杂点少近三成
前端
anOnion4 小时前
构建无障碍组件之Grid Pattern
前端·html·交互设计