VueJS 3:访问槽中的根HTML元素

pkbketx9  于 2023-02-09  发布在  Vue.js
关注(0)|答案(2)|浏览(213)

如何可靠地访问槽中的根HTML元素?我尝试了slots.default()[0].el,但它不一致。我意识到如果槽是一个简单的html,它就不是空的,这很好,但如果它有一些vue指令或组件,它将是空的。那么我如何可靠地获得槽中的根HTML元素呢?

rhfm7lfc

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>
txu3uszq

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);
    }

相关问题