假如你的自定義元件是這樣:
<template> <div> <button :class="`btn-${type}`"> <slot></slot> </button> </div> </template> <script> export default { name: "tButton", }; </script> <script setup> const props = defineProps({ type: { type: String, default: "primary", }, }); </script>
那麼怎麼判斷你在使用時,比如<t-button></t-button>,在該元件裡面有沒有使用到插槽slot呢?
解決方案:在tbutton元件裡面的onMountd鉤子判斷slot是否有值
<template> <div> <button :class="`btn-${type}`" v-if="isHaveSlot.default">
<slot></slot> </button> </div> </template> <script> export default { name: "tButton", }; </script> <script setup> import {defineSlots} from "vue"; const props = defineProps({ type: { type: String, default: "primary", }, }); const isHaveSlot = defineSlots();</script>
引入defineSlots鉤子,把defineSlots賦值給變數a,判斷a.default是否有值
如果你的slot沒有寫name值,那麼slot的預設name就叫default,如果你寫了多個slot且沒有name值,那麼slot還是隻有default作為name值,判斷該值是否為空即可
如果你的slot定義了name值為uisk,那麼你就要判斷a.uisk是否為空了
沒寫就default,有寫就用你寫的name
注意:上面是vue3的用法,如果是vue2,那就直接在tbutton元件判斷this.$slots的default是否為空,同理,有些name值,就判斷this.$slots.你的name是否為空
ps:vue3中使用slot的name插槽用法:v-slot:你的name