useForwardExpose
转发组件的暴露值、props 和 $el。
当构建一个组件时,如果它不是单一根节点的组件,模板引用将不会通过 $el 返回 DOM 元素(阅读更多),因此,我们需要手动转发该组件模板引用中的 $el。或者在某些情况下,您想将某个元素作为暴露元素。
此外,这个组合式函数扩展了模板引用中缺少的暴露 props 属性。
用法
<script setup lang="ts">
import { useForwardExpose } from 'reka-ui'
const selectedElementId = ref(1)
const { forwardRef } = useForwardExpose()
</script>
<template>
<span>
<div :ref="forwardRef">
...
</div>
</span>
</template>
例子
我们希望将一个 <button> 元素通过 expose() 向父组件公开,并能从父组件直接访问 DOM。
子组件:MyButton.vue
<script setup lang="ts">
import { useForwardExpose } from './composables/useForwardExpose' // 假设你的钩子放在 composables 文件夹中
import { onMounted, ref } from 'vue'
const buttonRef = ref<HTMLButtonElement | null>(null)
// 使用钩子处理 forwardExpose 逻辑
const { forwardRef } = useForwardExpose<HTMLButtonElement>()
// 在 mounted 时调用 forwardRef 绑定引用
onMounted(() => {
forwardRef(buttonRef.value)
})
</script>
<template>
<button ref="buttonRef" class="px-4 py-2 bg-blue-500 text-white rounded">
Click Me
</button>
</template>
父组件:App.vue
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import MyButton from './components/MyButton.vue'
const myButtonRef = ref<{ $el: HTMLElement } | null>(null)
onMounted(() => {
// 访问子组件暴露出来的 DOM 元素
console.log('Button DOM Element:', myButtonRef.value?.$el)
myButtonRef.value?.$el?.focus() // 访问子组件的 DOM 元素并调用 focus() 方法
})
</script>
<template>
<div class="p-4">
<MyButton ref="myButtonRef" />
</div>
</template>