仅在有内容时才显示插槽

新手上路,请多包涵

如果它有任何内容,有没有办法只显示一个插槽?

例如,我正在构建一个简单的 Card.vue 组件,并且我只希望在页脚插槽有内容时显示页脚:

模板

<template>
    <div class="panel" :class="panelType">
        <div class="panel-heading">
            <h3 class="panel-title">
                <slot name="title">
                    Default Title
                </slot>
            </h3>
        </div>

        <div class="panel-body">
            <slot name="body"></slot>

            <p class="category">
                <slot name="category"></slot>
            </p>
        </div>

        <div class="panel-footer" v-if="hasFooterSlot">
            <slot name="footer"></slot>
        </div>
    </div>
</template>

脚本

<script>
    export default {
        props: {
            active: true,
            type: {
                type: String,
                default: 'default',
            },
        },

        computed: {
            panelType() {
                return `panel-${this.type}`;
            },

            hasFooterSlot() {
                return this.$slots['footer']
            }
        }
    }
</script>

在视图中:

 <card type="success"></card>

由于上述组件不包含页脚,因此不应渲染它,但它是。

我试过使用 this.$slots['footer'] ,但这返回未定义。

有没有人有任何提示?

原文由 Steve Bauman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 526
2 个回答

它应该在

this.$slots.footer

所以,这应该有效。

 hasFooterSlot() {
  return !!this.$slots.footer;
}

例子

原文由 Bert 发布,翻译遵循 CC BY-SA 4.0 许可协议

您应该检查 vm.$slots 以及 vm.$scopedSlots

 hasSlot (name = 'default') {
   return !!this.$slots[ name ] || !!this.$scopedSlots[ name ];
}

原文由 Madmadi 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题