记一次解决element-plus警告的经历

背景

最近在做 Vue3 + Element-plus 的项目,启动项目之后发现控制台报了一堆警告,如下图:

虽然有警告,但是页面是正常运行的,但是身为一名有代码洁癖的程序员,控制台一堆警告怎么能忍。正好今天有空,仔细研究下这个问题。

分析问题

首先看下提示信息 no vaild child node found,翻译过来就是:没有找到有效的子节点。

根据这个提示信息我们只能知道有一个组件需要子节点,但是我们没有提供,但是具体是哪个组件呢?根本不知道。

没办法,接着往下看发出警告的 error.ts 文件吧。文件内容如下:

可以看出来是element-plus发出的警告,不过这文件只是一个ts类型定义文件,看不出来具体是什么报错。

那再看下一个文件only-child.tsx文件,文件内容如下:

可以看到该文件中定义了一个OnlyChild的Vue组件,具体分析下该组件:

  • 组件在setup阶段获取到当前默认插槽内容
  • 如果默认插槽内容长度大于1,则提示只能有一个子元素,并返回null
  • 之后获取插槽内容的的子元素,如果没有子元素,就会发出前面碰到的警告,并返回null
  • 如果默认插槽内容没问题,则使用自定义指定包装下firstLegitNode元素(因为这块与本次探讨的报错无关,故不展开说明)

再看下下面的findFirstLegitChild方法,该方法会遍历传入的VNode节点的子元素,直到Textsvg节点,之后将节点内容以span标签包裹,span标签的内容为Textsvg的内容。并且该方法可以一直查找子元素,直到找到可供显示的文字信息。

分析到这里,基本可以确定是OnlyChild这个组件默认插槽内没有任何子元素导致的,但是在element-plus的组件中并没有OnlyChild这个组件,那看来这个组件是element-plus内部的一个组件,不对外暴露。

问题解决

至此,分析的线索貌似是断了,不过可以使用二分法定位出错的组件

首先找到出错的页面,注释页面中的部分组件,再返回浏览器查看控制台是否还存在报错

如此这样,逐步缩小组件范围,最终定位在el-tooltip组件,这里贴下具体出错的代码:

js 复制代码
<el-tooltip :content="case_title" placement="top-start" effect="light" :show-after="TOOLTIP_SHOW_AFTER">
   <div v-if="case_title" class="one-line-ellipsis">{{ case_title }}</div>
</el-tooltip>

这样一看问题就比较明显了,el-tooltip的默认插槽使用了v-if做判断,当case_title为空时,该默认插槽的内容就是空,命中了子元素为空的情况,因而触发了警告。

为了解决该问题,我们只需要将v-if挪到el-tooltip上或是为子元素在最外层再套一层div,保证el-tooltip的子元素肯定存在即可。

相关推荐
谢慧琼43 分钟前
2026零基础做企业网站,低成本搭建官方网站
服务器·前端·javascript
weixin_431600442 小时前
前端数据埋点(1):一次点击如何变成一条埋点
前端·js·数据埋点
IT_陈寒2 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
计算机魔术师2 小时前
同样是AI辅助建造,为什么有的游戏三个月就烂尾了?
前端
用户921080262863 小时前
0. 做 Agent 产品,前端 AI 组件框架怎么选?
前端
拾年2753 小时前
React Hooks 进阶篇:useMemo / useCallback / useReducer / useImperativeHandle,用「算账 +
前端·javascript·react.js
Jackson__4 小时前
面试官:如何在老项目中使用新框架,并实现通信?
前端·javascript·面试
拾年2754 小时前
React Hooks 保姆级教程:把组件想象成失忆的打工人,4 个 Hook 带你原地起飞
前端·javascript·react.js
mmsx4 小时前
一个 Bug 修了 12 轮,根因只有一句话:AI 编程时代,日志才是唯一的真相
前端
默_笙4 小时前
😝 5 亿次循环卡死页面?我用 Web Worker 把它扔进后台线程,页面丝滑如初
前端·javascript