vue3判断插槽内容是否为空

介绍

  • MyCom.vue
vue 复制代码
<div>
    <slot>默认内容</slot>
</div>
  • 组件使用
js 复制代码
<MyCom>
    <!-- comment -->
    <div v-for="item in list"/>
</MyCom>

我们尝试在MyCom组件内打印slots.default()数组,即使list长度为0,依然会打印长度为2的数组:

bash 复制代码
[{..., type: Symbol(v-cmt)}, {..., type: Symbol(v-fgt)}]

结果大概是这样的(其他字段省略,这里只讲type字段的值)。

Symbol(v-fgt)

  • 表示 片段节点 (Fragment Node)
  • 对应 Vue 模板中的 <template> 标签(当它用作包裹多个元素时)

Symbol(v-cmt)

  • 表示 注释节点 (Comment Node)
  • 对应模板中的 HTML 注释 <!-- comment -->

代码实现

当我们需要用到判断插槽内容是否为空这个条件去其他场景使用时,我们并不能像vue2一样,只通过判断slots.default().length就能知道插槽内容是否为空。

  • 我们需要过滤掉注释节点、空的片段节点,再判断其长度即可
js 复制代码
const slots = useSlots();
const isEmpty = computed(() => {
  if (!slots.default) return true;
  const slotsFilter = slots.default().filter((vnode) => {
    return (
      vnode.type !== Symbol.for("v-cmt") &&
      vnode.type === Symbol.for("v-fgt") &&
      !!vnode.children.length
    );
  });
  return slotsFilter.length === 0;
});
相关推荐
徐小夕2 分钟前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
恋猫de小郭6 分钟前
KMP / CMP 鸿蒙版本 Beta 发布,他有什么特别之处?
android·前端·flutter
乘风gg26 分钟前
OpenClaw 爆火,但”飞书"赢麻了!!!
前端·ai编程·claude
Oneslide1 小时前
React 纯前端技术栈报告(2026年)
前端
前端一小卒1 小时前
AI 时代,前端工程化要重做一遍
前端
橙子家10 小时前
浏览器缓存之【基础键值存储】:Local storage 和 Session storage
前端
星星在线12 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒13 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x14 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者14 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端