0

0

React 中 key 属性失效的典型原因与正确用法详解

碧海醫心

碧海醫心

发布时间:2026-02-18 13:19:02

|

246人浏览过

|

来源于php中文网

原创

React 中 key 属性失效的典型原因与正确用法详解

React 报错“Each child in a list should have a unique ‘key’ prop”通常是因为 key 被错误地放在了条件渲染的内部元素上,而非直接包裹每个列表项的最外层 JSX 元素;本文通过真实案例解析根本原因,并给出符合 React 最佳实践的修复方案。

react 报错“each child in a list should have a unique ‘key’ prop”通常是因为 `key` 被错误地放在了条件渲染的内部元素上,而非直接包裹每个列表项的**最外层 jsx 元素**;本文通过真实案例解析根本原因,并给出符合 react 最佳实践的修复方案。

在 React 中,key 是用于标识列表中每个元素的唯一性标识,它必须直接作用于由 .map() 生成的顶层 JSX 元素(即直接子节点),而不能放在其内部嵌套结构或 Fragment 的子元素上。

回顾原始代码的问题:

{Object.entries(userRoleMenu[UserRole]).map((item, index) => <>
  {item[0] === 'fpv' ? (
    <MenuItem key={item[0]} /* ❌ 错误:key 在 MenuItem 上,但 <> 包裹了条件分支 */>
      {/* ... */}
    </MenuItem>
  ) : (
    <MenuItem key={item[0]}>
      {item[0]}
    </MenuItem>
  )}
</>)}

此处使用了空标签 >(即 React.Fragment),但它没有 key 属性。而 key 被错误地写在了 内部——这导致 React 实际接收到的 .map() 返回值是一个 Fragment,其子元素(即两个 分支)在运行时可能动态切换,但 Fragment 本身无 key,React 无法稳定追踪列表项,从而触发警告。

✅ 正确做法是:将 key 显式赋予 React.Fragment(或简写 > 的替代形式 ,确保每个 .map() 迭代项返回一个带唯一 key 的顶层元素:

import React, { Fragment } from 'react';

<MenuList width={'148px'}>
  {Object.entries(userRoleMenu[UserRole]).map(([key, value]) => (
    <Fragment key={key}> {/* ✅ 正确:key 在 Fragment 上 */}
      {key === 'fpv' ? (
        <MenuItem
          _hover={{ backgroundColor: 'gray.50' }}
          onClick={() => handleMenuClick([key, value])}
        >
          {/* 自定义 fpv 专属内容,例如图标或空占位 */}
          <Icon as={FpvIcon} />
        </MenuItem>
      ) : (
        <MenuItem
          _hover={{ backgroundColor: 'gray.50' }}
          onClick={() => handleMenuClick([key, value])}
        >
          {key}
        </MenuItem>
      )}
    </Fragment>
  ))}
</MenuList>

? 补充说明:

  • 使用解构 ([key, value]) 替代 (item, index) 更语义清晰,避免 item[0] 的可读性问题;
  • handleMenuClick(item) 原写法存在陷阱:若直接传入 item,回调中 onClick 会立即执行(而非点击时执行)。务必改为箭头函数 () => handleMenuClick(item),否则组件会因函数调用报错或重复渲染;
  • 若 userRoleMenu[UserRole] 可能为 undefined 或非对象,建议增加安全校验:
    {userRoleMenu?.[UserRole] && Object.entries(userRoleMenu[UserRole]).map(...)}

? 总结关键原则:

  • key 必须置于 .map() 返回的最外层 JSX 元素上;
  • 不要将 key 放在条件表达式(? :)内部的任一分支上;
  • 使用 Fragment 是合法且推荐的,但必须显式添加 key(空标签 不支持 key,需用 );
  • 避免用 index 作为 key(除非列表严格静态且无增删重排),优先使用业务唯一 ID(如本例中的 item[0] 即菜单键名)。

遵循以上规范,即可彻底消除 Warning: Each child in a list should have a unique "key" prop,并提升列表渲染的稳定性与性能。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.11.27

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5628

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3214

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1217

2025.12.25

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

472

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

157

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号