vue3中的 $ref 和 $parent

效果图

效果图结合全部代码看就好理解了
在这里插入图片描述

$ref

  1. 在父组件引入时绑定ref ,例如<Son ref="son"></Son>
  2. 父组件获取子组件Son的实例,获取子组件dom与实例,变量名需要与标签上的ref值一致
// 获取子组件dom与实例,变量名需要与子组件的ref一致
// Ref<InstanceType<typeof Son> | null> 表示它可以持有Son组件的实例类型或null。
let son = ref<InstanceType<typeof Son> | null>(null);
  1. 获取子组件的属性和方法,需要在子组件使用defineExpose方法对外暴露
defineExpose({
    money, // 属性
    setMoney // 方法
})
  1. 获取子组件参数或调用子组件方法,示例
let son = ref<InstanceType<typeof Son> | null>(null);

const getSonMoney = ():void => {
	// son?.value?.money获取子组件的属性
    sonMoney.value = <number>son?.value?.money;
}

const setSonMoney = ( num: number ):void => {
    money.value += num;
    // 调用子组件的方法
    son.value?.setMoney(num);
    getSonMoney();
}

$parent

子组件获取父组件的属性与方法,需要传入$parent,同时,父组件也需要使用defineExpose 对外暴露,才能使用

<el-button @click="getParentMoney($parent)" type="primary">查看父亲的余额</el-button>

const getParentMoney = (parent):void => {
    alert(`父亲余额: ${parent.money}`)
}

全部代码

父组件

<template>
  <div>
    <h1>父亲余额:{{ money }}</h1>
    <el-button @click="getSonMoney" type="success">查看儿子的余额</el-button>
    <el-button @click="setSonMoney(500)" type="info">借儿子500</el-button>

    <hr>
    <Son ref="son"></Son>
    <h5>儿子余额:{{ sonMoney }}</h5>
  </div>
</template>

<script lang='ts' setup>
import Son from './components/son.vue';
import { ref } from 'vue';

let money = ref<number>(50000);
let sonMoney = ref<number>(0);

// 获取子组件dom与实例,变量名需要与子组件的ref一致
// Ref<InstanceType<typeof Son> | null> 表示它可以持有Son组件的实例类型或null。
let son = ref<InstanceType<typeof Son> | null>(null);

const getSonMoney = ():void => {
    sonMoney.value = <number>son?.value?.money;
}

const setSonMoney = ( num: number ):void => {
    money.value += num;
    son.value?.setMoney(num);
    getSonMoney();
}

const car = ():void => {
    alert('宝马740');
}

defineExpose({
    money,
    car
})

</script>
<style lang='scss' scoped>
</style>

子组件

<template>
  <div>
    <h3>儿子</h3>
    <el-button @click="getParentMoney($parent)" type="primary">查看父亲的余额</el-button>
    <el-button @click="getCar($parent)" type="primary">跟父亲借车</el-button>

  </div>
</template>

<script lang='ts' setup>
import { ref } from 'vue';
let money = ref<number>(3006);

const setMoney = ( num:number ):void => {
    money.value -= num;
}

const getParentMoney = (parent):void => {
    alert(`父亲余额: ${parent.money}`)
}

const getCar = (parent):void => {
    parent.car()
}

// 父组件要获取该组件的属性和方法需要暴露出去
defineExpose({
    money,
    setMoney
})
</script>
<style lang='scss' scoped>
</style>
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值