您好!欢迎来到源码码网

Element Plus报Duplicate keys found during update:”108”Make sure keys are unique错误的解决方案

  • 源码教程
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2025-12-18 11:40
  • 阅读:105

近日在使用Element Plus开发的时候,在自定义了CustomTreeSelect后,控制台频繁的报以下错误:

image.png

找到最终的错误原因是来自于select.vue的错误警告,如下。

Duplicate keys found during update:"108"Make sure keys are unique.
2
Duplicate keys found during update:"109"Make sure keys are unique.
Duplicate keys found during update:"124"Make sure keys are unique.
Duplicate keys found during update:"122"Make sure keys are unique.
Duplicate keys found during update:"113"Make sure keys are unique.
Duplicate keys found during update:"102"Make sure keys are unique.
Duplicate keys found during update:"101"Make sure keys are unique.
Duplicate keys found during update:"118"Make sure keys are unique.
2
Duplicate keys found during update:"120"Make sure keys are unique.
Duplicate keys found during update:"116"Make sure keys are unique.
2
Duplicate keys found during update:"117"Make sure keys are unique.
Duplicate keys found during update:"92"Make sure keys are unique.
Duplicate keys found during update:"91"Make sure keys are unique.
2
Duplicate keys found during update:"121"Make sure keys are unique.
Duplicate keys found during update:"90"Make sure keys are unique.
Duplicate keys found during update:"89"Make sure keys are unique.
2
Duplicate keys found during update:"105"Make sure keys are unique.
2
Duplicate keys found during update:"96"Make sure keys are unique.
Duplicate keys found during update:"88"Make sure keys are unique.
Duplicate keys found during update:"94"Make sure keys are unique.

在deepseek和豆包的建议下,经过反复的对自定义组件的修改,但是问题始终没有得到解决,但是它又不影响功能的正常使用,只是在组件编辑更新,自动折叠展开的时候才会出现这个问题,于是可以肯定,这个问题是来自于elment-plus的底层设计问题,采用精准屏蔽的方式消除该警告。在main.js文件中加入一下屏蔽代码,以下是具体屏蔽方法:

//1. 保存原始 console.warn
const originalWarn = console.warn;
// 2. 重写 warn,匹配警告核心文本(去掉对 select.vue 的依赖)
console.warn = function (...args) {
    // 匹配条件:包含 "Duplicate keys found during update" 即可
    const warnMsg = args[0] || '';
    if (warnMsg.includes('Duplicate keys found during update')) {
        // 可选:打印到控制台但不抛出警告(方便调试)
        // console.log('[屏蔽的重复key警告]', ...args);
        return; // 彻底屏蔽
    }
    // 其他警告正常输出
    originalWarn.apply(console, args);
};
// 3. 覆盖 Vue 内部的 warnHandler(Element Plus 可能走这个通道)
app.config.warnHandler = (msg, instance, trace) => {
    if (msg.includes('Duplicate keys found during update')) {
        return;
    }
    originalWarn(`[Vue warn]: ${msg}`, trace);
};


那么,为什么会出现这样的问题呢?以下是豆包给出的分析:

一、为什么 Element Plus 会 “无意义” 抛出这个警告?

这个警告本质是 Element Plus 组件设计的「逻辑漏洞」 —— 警告本身是 “误报”,但组件库的渲染机制导致无法避免,核心原因有 3 点:


1. el-select + el-tree 嵌套的「渲染模型冲突」

el-select 的下拉框是通过 teleport 挂载到 <body> 下的独立 DOM 容器(脱离当前组件 DOM 树);

el-tree 是动态递归渲染的树形组件,折叠 / 展开时会频繁增删子节点;

当你操作树节点时,el-select 会感知到下拉框内的 DOM 变化并触发 “更新检查”,但 Vue 对「跨容器(teleport)的动态节点」的 key 跟踪机制存在缺陷 —— 明明节点 key 是唯一的,却误判为 “重复”,进而抛出警告。


2. Element Plus 内部的 v-for 索引 key 兜底逻辑

你之前看到的 select.vue 源码中,ElOption 的渲染用了 v-for="(item, index) in options" :key="index" —— 这是 Element Plus 为了兼容 “任意格式数据源” 的兜底逻辑:

即使你传入的 options 有唯一 value,组件内部仍会用 index 作为 ElOption 的 fallback key;

当树形数据动态更新时,index 会临时重复(比如折叠后子节点消失,展开后又出现),触发 Vue 的重复 key 检查,而 Element Plus 并未对这种嵌套场景做 “警告豁免”。


3. 警告是「Vue 底层的通用检查」,组件库未做过滤

这个警告并非 Element Plus 主动抛出,而是 Vue 内核对 v-for 渲染的通用检查:

Vue 会遍历所有带 key 的 DOM 节点,只要检测到同一层级有重复 key,就会调用 console.warn;

Element Plus 知道 el-select + el-tree 嵌套会触发这个误报,但出于 “不屏蔽通用警告” 的设计原则(避免掩盖真问题),并未在组件内过滤,最终导致警告暴露到控制台。


二、为什么警告 “不影响功能”?

因为这个警告是 “渲染层的误判”,而非 “业务逻辑错误”:

功能层面:你的 deptId 是唯一的,el-tree 的 node-key 能正确跟踪节点状态(选中、折叠 / 展开、编辑后更新),数据交互、接口调用、状态同步都不受影响;

渲染层面:Vue 即使检测到 “重复 key”,也会做「兜底处理」—— 强制重新渲染节点,虽然有性能损耗(微乎其微),但不会导致 DOM 错乱或功能异常;

简单说:Vue 只是 “提醒你可能有问题”,但实际没有问题,组件库也知道这个场景下的提醒是多余的,只是没做过滤。


三、补充:什么时候这个警告才是 “真问题”?

只有满足以下场景时,这个警告才需要重视(你的场景完全不满足):

你手动写的 v-for 用了重复 key(比如列表渲染时 :key="index" 且数据有重复);

业务数据真的有重复 ID(比如 deptId 重复),导致节点状态错乱(选中错节点、折叠后数据不更新);

警告伴随功能异常(比如编辑后数据不刷新、新增子部门后下拉框空白)。


四、总结

这个警告是 Element Plus 组件库设计缺陷 + Vue 通用检查机制 叠加的 “误报”:

对开发者:无功能影响,只是控制台噪音,屏蔽即可;

对组件库:是已知的 “小瑕疵”,但修复成本高(需要修改 el-select 的 teleport 渲染逻辑 + 对 el-tree 嵌套场景做特殊 key 处理),因此长期未修复;

你的处理方式(精准屏蔽)是当前最优解 —— 既不影响功能,又消除控制台干扰,且不会掩盖其他真问题(因为只屏蔽了 “Duplicate keys found during update” 这一条警告)。

简单说:这是组件库的 “锅”,不是自己代码问题,屏蔽是合理且安全的选择。


特别声明:
1、如无特殊说明,内容均为本站原创发布,转载请注明出处;
2、部分转载文章已注明出处,转载目的为学习和交流,如有侵犯,请联系客服删除;
3、编辑非《源码码网》的文章均由用户编辑发布,不代表本站立场,如涉及侵犯,请联系删除;
全部评论(0)
推荐阅读
  • 大型后台管理系统,用户登录状态该如何保存?
  • 大型后台管理系统,用户登录状态该如何保存?
  • 大型后台管理系统的用户登录状态保存需要综合考虑安全性、用户体验和系统架构。以下是企业级的完整方案:1.多层级存储策略class AuthManager {    constructor() {        this.storage = { &n
  • 源码教程
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2025-11-06 12:16
  • 阅读:333
  • 源码交易平台的支付困局与解决方案:如何通过专业支付系统提升交易效率
  • 源码交易平台的支付困局与解决方案:如何通过专业支付系统提升交易效率
  • 在数字经济蓬勃发展的今天,源码交易市场已成为互联网创业者和开发商的重要资源池。从电商系统源码到社交应用框架,从小程序解决方案到企业级管理系统,越来越多的开发者、初创企业和传统商家通过源码交易平台快速获取技术资产,实现商业目标的加速。源码交易市场的繁荣反映了数字化转型的迫切需求——企业需要快速迭代,开发者需要快速变现,用户需要快速启动。然而,在这个高速发展的市场中,一个长期被忽视但至关重要的问题浮现出来:支付系统的效率与安全性已成为制约交
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2025-10-23 15:16
  • 阅读:280
  • Spring Boot 工程中 maven-surefire-plugin 测试执行失败及解决方法
  • Spring Boot 工程中 maven-surefire-plugin 测试执行失败及解决方法
  • 在SpringBoot工程编译时遇到maven-surefire-plugin的测试执行失败错误(Failedtoexecutegoalorg.apache.maven.plugins:maven-surefire-plugin:3.5.3:test),通常与测试环节相关。以下是常见原因及解决方法:1.测试用例执行失败• 原因:最常见的是测试用例(*Test.java)运行时抛出异常(如断言失败、空指针等),导
  • 源码教程
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2025-10-13 10:57
  • 阅读:350
  • WeMark - 微信小程序图片水印
  • WeMark - 微信小程序图片水印
  • 一个纯前端的微信小程序图片水印工具。支持文字/图片水印、单个与全屏两种模式,透明度与角度调节、单个水印位置X/Y控制,预览与对比模态、历史记录(100条)等功能。
  • 源码教程
  • 来源:源码码用户
  • 编辑:yg
  • 时间:2025-09-22 16:09
  • 阅读:268
联系客服
源码代售 源码咨询 素材咨询 联系客服
029-84538663
手机版

扫一扫进手机版
返回顶部