如何可靠地访问槽中的根HTML元素?我尝试了slots.default()[0].el,但它不一致。我意识到如果槽是一个简单的html,它就不是空的,这很好,但如果它有一些vue指令或组件,它将是空的。那么我如何可靠地获得槽中的根HTML元素呢?
rhfm7lfc1#
我找到了一个可能的解决办法:也就是说,让插槽内容提供程序通过提供要调用的slot-prop方法来显式设置要引用的元素。另外,由于Vue 3模板支持多个根元素,因此假设插槽总是有一个根元素并不可靠。下面是解决方案的示例:
<template> <slot :set-element="(el) => element = el"></slot> </template> <script setup lang="ts"> import { ref, watchEffect } from "vue"; const element = ref<Element | null>(null); watchEffect(() => { console.log(element.value); }); </script>
在组件的使用中,注入slot props并使用Function Refs语法
<MyComponent v-slot="{ setElement }"> <div :ref="(el) => setElement(el)">...</div> <div>...</div> </MyComponent>
txu3uszq2#
您可以使用slot的vnode属性直接访问slot的根HTML元素,也可以在组件脚本中使用. $refs.root。下面是一个例子:
<template v-slot:[slotName]="{ vnode }"> <div ref="root"> <!-- your slot content goes here --> </div> </template> mounted() { const root = this.$refs.root as HTMLElement; console.log(root); }
2条答案
按热度按时间rhfm7lfc1#
我找到了一个可能的解决办法:也就是说,让插槽内容提供程序通过提供要调用的slot-prop方法来显式设置要引用的元素。另外,由于Vue 3模板支持多个根元素,因此假设插槽总是有一个根元素并不可靠。
下面是解决方案的示例:
在组件的使用中,注入slot props并使用Function Refs语法
txu3uszq2#
您可以使用slot的vnode属性直接访问slot的根HTML元素,也可以在组件脚本中使用. $refs.root。
下面是一个例子: