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;
});
相关推荐
康小汪6 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南7 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
白山编程大哥9 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt10 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn10 小时前
bundle优化
前端
北冥有鱼11 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚11 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户372037492601811 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能11 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师11 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端