@kano的回答很好,但有一个问题:`this.$slots`不是响应式的,所以如果它一开始是`false`,然后变成`true`,任何`computed`属性都不会更新。
解决方案是不依赖于`computed`值,而是依赖于`created`和`beforeUpdated`(正如@MathewSonke指出的那样)。
export default {
name: "YourComponentWithDynamicSlot",
data() {
return {
showFooter: false,
showHeader: false,
};
},
created() {
this.setShowSlots();
},
beforeUpdate() {
this.setShowSlots();
},
methods: {
setShowSlots() {
this.showFooter = this.$slots.footer?.[0];
this.showHeader = this.$slots.header?.[0];
},
},
};
更新:Vue 3(组合式 API)
对于Vue 3,似乎检查插槽是否有内容的方法已更改(使用新的组合式 API):
import { computed, defineComponent } from "vue";
export default defineComponent({
setup(_, { slots }) {
const showHeader = computed(() => !!slots.header);
return {
showHeader,
};
},
});
注意:我找不到任何关于这个的文档,所以请谨慎对待,但在我非常有限的测试中似乎可以工作。
$slots.default.text
始终为未定义。这是一个jsfiddle:https://jsfiddle.net/JohnMoore/rmafyz2x/2/ - John Moore$slots.default
是一个数组,所以您需要的是$slots.default[0].text
:) - kano$slots.default[0].text
,我就可以实现我想要的东西。 - John Moore<transition>
元素。 过渡元素具有undefined
文本属性。在我的情况下,我有一个计算属性,返回!!this.$slots.default && !!this.$slots.default[0]
。 - parker_codes