Vue3 检查插槽是否为空

Dre*_*lug 23 vue.js vuejs3

Vue3 是否有相当于以下 Vue2 方法:

methods: {
   hasSlot(name) {
      return !!this.$slots[name]
   }
}
Run Code Online (Sandbox Code Playgroud)

在 Vue3 的 Composition API 中?

我试过了:

setup({slots}) {
   const hasSlot = (name) => {
      return !!slots[name];
   }

   return { hasSlot }

}
Run Code Online (Sandbox Code Playgroud)

但它没有返回预期值,因为slots未定义(控制台中的每个错误)。

小智 42

现在,在 Vue3 组合 API 中,您可以使用useSlots.

<script setup>
const slots = useSlots()
const hasSlot = (name) => {
    return !!slots[name];
  }
</script>
Run Code Online (Sandbox Code Playgroud)

  • 仅供记录:`useSlots()`返回一个对象,其中键是槽的名称。未命名的插槽具有“default”键。 (13认同)

ton*_*y19 34

正如注释中指出的,第二个参数setup() the context)包含组件的slots. 第一个参数是组件的props.

export default {
  setup(props, { slots }) {
    const hasSlot = name => !!slots[name]
    return { hasSlot }
  }
}
Run Code Online (Sandbox Code Playgroud)

演示1

插槽也在模板中公开为$slots,因此您可以替换hasSlot(slotName)$slots[slotName]或 只是$slots.SLOTNAME(例如,$slots.footer):

<template>
  <footer v-if="$slots.footer">
    <h3>footer heading</h3>
    <slot name="footer" />
  </footer>
</template>
Run Code Online (Sandbox Code Playgroud)

演示2

  • 但是,如果您没有命名槽并且想要检查默认槽是否为空怎么办? (2认同)
  • 我的 $slots.default 是一个函数,所以总是 true,如何解决这个问题? (2认同)