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;
});
相关推荐
顾安r20 分钟前
11.8 脚本网页 星际逃生
c语言·前端·javascript·flask
Hello.Reader22 分钟前
Data Sink定义、参数与可落地示例
java·前端·网络
im_AMBER1 小时前
React 17
前端·javascript·笔记·学习·react.js·前端框架
谷歌开发者2 小时前
Web 开发指向标 | Chrome 开发者工具学习资源 (六)
前端·chrome·学习
一晌小贪欢2 小时前
【Html模板】电商运营可视化大屏模板 Excel存储 + 一键导出(已上线-可预览)
前端·数据分析·html·excel·数据看板·电商大屏·大屏看板
发现你走远了2 小时前
连接模拟器网页进行h5的调试(使用Chrome远程调试(推荐)) 保姆级图文
前端·chrome
街尾杂货店&3 小时前
css - 实现三角形 div 容器,用css画一个三角形(提供示例源码)简单粗暴几行代码搞定!
前端·css
顺凡3 小时前
删一个却少俩:Antd Tag 多节点同时消失的原因
前端·javascript·面试
小白路过3 小时前
CSS transform矩阵变换全面解析
前端·css·矩阵
爬山算法3 小时前
Redis(110)Redis的发布订阅机制如何使用?
前端·redis·bootstrap