使用 <script setup>
的组件是默认关闭的——即通过模板引用或者 $parent
链获取到的组件的公开实例,不会暴露任何在 <script setup>
中声明的绑定。
可以通过 defineExpose
编译器宏来显式指定在 <script setup>
组件中要暴露出去的属性。我们可以通过在子组件中defineExpose
暴露一些属性和方法。父组件中可直接调用子组件定义的方法和获取属性值。下面是一个小demo示范下defineExpose的使用。
子组件demo-child.vue
<template>
<view class="out">
子组件的值:{{count}}
</view>
</template>
<script setup>
import {ref} from "vue"
const count = ref(100)
const updateCount = function(){
count.value++
}
defineExpose({
count,
name:"XXM",
updateCount
})
</script>
子组件中暴露了2个属性count和name,1个方法updateCount。
父组件中使用:
<template>
<view class="layout">
<demo-child ref="child"></demo-child>
<view>--------------</view>
<button @click="update">点击修改子值</button>
</view>
</template>
<script setup>
import {onMounted, ref} from "vue"
const child = ref(null)
const update = function(){
child.value.updateCount()
}
onMounted(()=>{
console.log(child.value)
})
</script>
上面JS中使用了一个vue3的生命周期钩子函数onMounted,用于在页面未渲染完成时获取值。
上面通过child.value.updateCount()获得子组件定义的方法updateCount。
来看实际效果:
随着按钮的点击,子组件的值由最初的100变成105,调用的是子组件定义的函数updateCount来修改值。当执行点击事件时,页面已渲染完成,因此无需在onMounted取值,在外层即可获取到值。