报错详解——Vue升级带来的elementui冲突警告: Invalid prop: custom validator check failed for prop “type“.

目录

报错详解——Vue升级带来的elementui冲突警告:Invalid prop: custom validator check failed for prop "type". 

一、错误情景描述

1、报错情景和信息

2、解决方案 

二、深度思考——为什么会警告?为什么页面能显示? 

三、vue与elementui在不同版本下的细微变化

四、仍然存在的一个疑问

五、总结


        作者:watermelo37

        CSDN万粉博主、华为云云享专家、阿里云专家博主、腾讯云、支付宝合作作者,全平台博客昵称watermelo37。

        一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

报错详解——Vue升级带来的elementui冲突警告:Invalid prop: custom validator check failed for prop "type". 

一、错误情景描述

1、报错情景和信息

        在页面渲染的时候,控制台弹出大量警告,严重影响控制台的信息获取功能,但是页面基本能正常显示。

        警告内容有两种:

①:

Invalid prop: custom validator check failed for prop "type". 

②:

Invalid prop: validation failed for prop "type". Expected one of ["success", "info", "warning", "danger", ""], got value "primary". 

2、解决方案 

        直面问题,这个警告就是说类型验证失败,类型应该是"success", "info", "warning", "danger", ""的其中之一,但是实际获取的类型是“primary”。

        再加上警告第三行说明了是tag标签的type不对,更有助于定位错误位置。

        那就找到对应的位置,将tag类型修改为上述五种之一即可。

            <el-form-item label="Status: ">
              <el-tag
                :type="
                  getStatus(instance.status) == 'initialized' ||
                  getStatus(instance.status) == 'started'
                    ? ''
                    : getStatus(instance.status)
                "
                disable-transitions
              >
                {
   
   { getStatus(instance.status) }}
              </el-tag>
            </el-form-item>

二、深度思考——为什么会警告?为什么页面能显示? 

        首先,我是在当前项目中整合了以前写的内容,原则上不应该会有错误或警告,为什么会出现警告呢?

        其次,如果我的type类型是错误的,按照elementui的习惯,要么直接报错崩溃,要么按照默认类型显示,但是实际显示是蓝色tag,熟悉elementui的人都知道,蓝色样式一般就是对应的primary的类型,难道说明我设置的type=“primary”生效了,那为什么又会发出警告呢?

三、vue与elementui在不同版本下的细微变化

        产生上述疑问后,我突然意识到一个问题,我当前的项目是基于Vue3+Vite开发的,之前的项目是基于Vue2+Webpack开发的,Vue3匹配的框架库是elementui plus,Vue2匹配的框架库是elementui。可能是elementui与elementui plus之间有细微的改动?

        查阅elementui官网文档,发现:elementui中tag的type有五种:"success", "info", "warning", "danger", "",默认/缺省值为蓝色tag。

         再查阅一下elementui plus的官方文档,发现已经不存在“”这个类型了,而是直接变成了“primary”。tag的type有:"success", "info", "warning", "danger", "primary",并且能通过color值自定义背景颜色。

        到这里就破案了,elementui存在两个tag的type版本,旧版本中空值和新版中的“primary”效果一致,所以这里出现了一个警告。tpye的值只要不是"success", "info", "warning", "danger", ""这五者之一,就会变成默认的蓝色tag,“primary”并没有生效,这只是一个巧合,开始验证,我将type的值改为“123”(确定是一个毫无意义的值):

            <el-form-item label="Status: ">
              <el-tag
                :type="
                  getStatus(instance?.status) == 'initialized' ||
                  getStatus(instance?.status) == 'started'
                    ? '123'
                    : getStatus(instance?.status)
                "
                disable-transitions
              >
                {
   
   { getStatus(instance?.status) }}
              </el-tag>
            </el-form-item>

        页面依然显示为蓝色的tag,并且报错一样。验证与猜想一致。

四、仍然存在的一个疑问

        我确定我引入的是elementui plus,我这个项目根本就没有引入elementui,而且Vue3项目中通过defineCompatSource等方式引入Vue2的组件,但这种兼容性是通过桥接实现的,最后的内核依然是基于Vue3,运行环境也是基于Vue3的。

        不管是从运行环境和内核的角度(Vue3环境适配elementui plus),还是从我项目中引入模块的角度(仅仅只引入了elementui plus),都不应该是Vue2要求的"success", "info", "warning", "danger", ""五选一,而应该是Vue3中的规范,"success", "info", "warning", "danger", "primary"五选一。

        也就是说虽然我找到了解决警告的方法和出现警告的原因,但其实刨根问底根本就不应该出现这个警告。

        这个问题以我现在的学识无法解决,庆幸的是我弄清楚了这个问题的表层和中层原因,已经非常足够了。

        不如大胆一点,我认为这是编译器/编译环境、Vite或者Vue官方三者中某一方出现bug,这个可能性是存在的。

五、总结

        一次性解决两种bug:Invalid prop: custom validator check failed for prop "type". Invalid prop: validation failed for prop "type". Expected one of ["success", "info", "warning", "danger", ""], got value "primary". 

        关键不是解决了bug,是知道bug的出现原因,以及有更加深层的思考。思考是bug带来的最好的礼物。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        DeepSeek:全栈开发者视角下的AI革命者

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能

        通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        干货含源码!如何用Java后端操作Docker(命令行篇)