Vue3.0如何ref调用子组件的变量和方法

本文解释了在Vue中如何在子组件Child中使用`ref`,强调了在setup函数中定义变量与`onMounted`生命周期的差异。还讨论了`<scriptsetup>`下子组件私有化的问题,以及如何通过`defineExpose`暴露变量和方法以解决访问问题。
摘要由CSDN通过智能技术生成

github

Child子组件中用ref定义出标识,setup函数中定义变量child

注意:在setup中定义的变量名要与子组件中的ref标识保持一致

<script setup>
import { ref, onMounted } from 'vue'
import Child from './Child.vue'

const child = ref(null)

onMounted(() => {
  // child.value 是 <Child /> 组件的实例
})
</script>

<template>
  <Child ref="child" />
</template>

为什么const child = ref(null) 赋值为null呢?这是因为setup()执行要比onMounted()函数要早,所以在setup函数中它是未定义的,你需要赋null给它。

在onMounted()生命周期函数中

// child.value 是 <Child /> 组件的实例
onMounted(() => {
  child.value.name  // 引用子组件的name变量
  child.value.run() // 调用子组件的run()方法
})

 在其他地方使用nextTick钩子

import { nextTick } from "vue";

// 在nextTick函数中,此时DOM已挂载完毕
nextTick(() => {
  child.value.name  // 引用子组件变量
  child.value.run()  // 调用子组件方法
})

注意:子组件的变量与方法,是在语法糖<script setup> 的组件中定义的,那么上述使用还是报错(无法找打子组件的变量和方法) 

这是因为使用了 <script setup> 的组件是默认私有的:一个父组件无法访问到一个使用了 <script setup> 的子组件中的任何东西。

那么如何解决呢?

子组件在其中通过 defineExpose 宏显式暴露

<script setup>
import { ref } from 'vue'

// 变量
const a = 1
const b = ref(2)
// 方法
const run = () => {
  console.log("running")
}

defineExpose({
  a,
  b,
  run
})
</script>

 值得注意的是,需要使用defineExpose暴露的变量与方法,必须声明在defineExpose宏前面,否则会报错【找不到需要导出的变量/方法】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值