确定插槽内容是空还是空

Joh*_*ore 6 vue.js

我有一个小的Loading组件,我的默认文本是'Loading ...'.插槽的好候选者,所以我有这样的东西作为我的模板:

<p class="loading"><i class="fa fa-spinner fa-spin"></i><slot>Loading...</slot></p>

这允许我用例如更改加载消息<loading>Searching...</loading>.但是,我想要的行为不仅仅是在没有提供插槽内容的情况下显示默认消息,而且如果插槽内容为空或空白.目前,如果我这样做<loading>{{loadingMessage}}</loading>并且loadingMessage为null,则不显示任何文本(我希望显示默认文本).理想情况下我需要测试this.$slots.default.这告诉我是否传入了内容,但是如何判断它是否为空?this.$slots.default.text返回undefined.

kan*_*ano 7

你需要一个检查的计算属性this.$slots.使用默认插槽进行检查this.$slots.default,并使用命名插槽替换default插槽名称.

computed: {
  slotPassed() {
    return !!this.$slots.default[0].text.length
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在模板中使用它:

<template>
  <div>
    <slot v-if="slotPassed">Loading...</slot>
    <p v-else>Searching...</p>
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到一个小例子.请注意如何显示后备内容,而不是插槽内的"默认内容".

编辑:我的措辞可能会更好.您需要做的是检查$slots.X值,但计算属性是检查它的一种方法.您也可以在模板中编写插槽检查:

<template>
  <div>
    <slot v-if="!!$slots.default[0].text">Loading...</slot>
    <p v-else>Searching...</p>
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,有一个槽通过了,但上面的答案仍然失败,因为槽是一个 Vue `&lt;transition&gt;` 元素,里面有另一个元素。过渡元素的文本属性为“未定义”。就我而言,我有一个计算属性,它返回 `!!this.$slots.default &amp;&amp; !!this.$slots.default[0]`。 (3认同)

fre*_*ett 6

@kano 的答案效果很好,但有一个问题:this.$slots不是反应性的,所以如果它开始是false,然后变成true,任何computed属性都不会更新。

解决方案是不依赖于computed值,而是依赖于createdand 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];
    },
  },
};
Run Code Online (Sandbox Code Playgroud)

更新:Vue 3(组合 API)

对于Vue 3,检查槽是否有内容的方式似乎已经改变(使用新的组合API):

import { computed, defineComponent } from "vue";

export default defineComponent({
  setup(_, { slots }) {
    const showHeader = computed(() => !!slots.header);

    return {
      showHeader,
    };
  },
});
Run Code Online (Sandbox Code Playgroud)

注意:我找不到任何关于此的文档,因此请持保留态度,但似乎在我非常有限的测试中有效。