当前位置: 首页 > news >正文

HoRain云--React 列表 Keys

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

React 实例

React 实例

Keys

用keys提取组件

错误的示范

key的正确使用方式

React 实例

元素的 key 在他的兄弟元素之间应该唯一

React 实例

在 jsx 中嵌入 map()

React 实例


React 实例

使用 map() 方法遍历数组生成了一个 1 到 5 的数字列表:

const numbers = [1, 2, 3, 4, 5]; const listItems = numbers.map((numbers) => <li>{numbers}</li> ); const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <ul>{listItems}</ul> );


我们可以将以上实例重构成一个组件,组件接收数组参数,每个列表元素分配一个 key,不然会出现警告 a key should be provided for list items,意思就是需要包含 key:

React 实例

function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <li key={number.toString()}> {number} </li> ); return ( <ul>{listItems}</ul> ); } const numbers = [1, 2, 3, 4, 5]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <NumberList numbers={numbers} /> );


Keys

Keys 可以在 DOM 中的某些元素被增加或删除的时候帮助 React 识别哪些元素发生了变化。因此你应当给数组中的每一个元素赋予一个确定的标识。

const numbers = [1, 2, 3, 4, 5]; const listItems = numbers.map((number) => <li key={number.toString()}> {number} </li> );

一个元素的 key 最好是这个元素在列表中拥有的一个独一无二的字符串。通常,我们使用来自数据的 id 作为元素的 key:

const todoItems = todos.map((todo) => <li key={todo.id}> {todo.text} </li> );

当元素没有确定的 id 时,你可以使用他的序列号索引 index 作为 key:

const todoItems = todos.map((todo, index) => // 只有在没有确定的 id 时使用 <li key={index}> {todo.text} </li> );

如果列表可以重新排序,我们不建议使用索引来进行排序,因为这会导致渲染变得很慢。


用keys提取组件

元素的 key 只有在它和它的兄弟节点对比时才有意义。

比方说,如果你提取出一个 ListItem 组件,你应该把 key 保存在数组中的这个 <ListItem /> 元素上,而不是放在 ListItem 组件中的<li>元素上。

错误的示范

function ListItem(props) { const value = props.value; return ( // 错啦!你不需要在这里指定key: <li key={value.toString()}> {value} </li> ); } function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => //错啦!元素的key应该在这里指定: <ListItem value={number} /> ); return ( <ul> {listItems} </ul> ); } const numbers = [1, 2, 3, 4, 5]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <NumberList numbers={numbers} /> );

key的正确使用方式

React 实例

function ListItem(props) { // 对啦!这里不需要指定key: return <li>{props.value}</li>; } function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => // 又对啦!key应该在数组的上下文中被指定 <ListItem key={number.toString()} value={number} /> ); return ( <ul> {listItems} </ul> ); } const numbers = [1, 2, 3, 4, 5]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <NumberList numbers={numbers} /> );


尝试一下 »

当你在 map() 方法的内部调用元素时,你最好随时记得为每一个元素加上一个独一无二的 key。


元素的 key 在他的兄弟元素之间应该唯一

数组元素中使用的 key 在其兄弟之间应该是独一无二的。然而,它们不需要是全局唯一的。当我们生成两个不同的数组时,我们可以使用相同的键。

React 实例

function Blog(props) { const sidebar = ( <ul> {props.posts.map((post) => <li key={post.id}> {post.title} </li> )} </ul> ); const content = props.posts.map((post) => <div key={post.id}> <h3>{post.title}</h3> <p>{post.content}</p> </div> ); return ( <div> {sidebar} <hr /> {content} </div> ); } const posts = [ {id: 1, title: 'Hello World', content: 'Welcome to learning React!'}, {id: 2, title: 'Installation', content: 'You can install React from npm.'} ]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <Blog posts={posts} /> );

key 会作为给 React 的提示,但不会传递给你的组件。如果您的组件中需要使用和 key 相同的值,请将其作为属性传递:

const content = posts.map((post) => <Post key={post.id} id={post.id} title={post.title} /> );

上面例子中,Post 组件可以读出 props.id,但是不能读出 props.key。


在 jsx 中嵌入 map()

在上面的例子中,我们声明了一个单独的 listItems 变量并将其包含在 JSX 中:

function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <ListItem key={number.toString()} value={number} /> ); return ( <ul> {listItems} </ul> ); }

JSX 允许在大括号中嵌入任何表达式,所以我们可以在 map() 中这样使用:

React 实例

function NumberList(props) { const numbers = props.numbers; return ( <ul> {numbers.map((number) => <ListItem key={number.toString()} value={number} /> )} </ul> ); }

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

http://www.jsqmd.com/news/1017168/

相关文章:

  • MPC866 PowerQUICC处理器核心架构与指令集深度解析
  • ChatGPT 5.5 怎么用在日常开发里?我总结了 6 个最实用场景
  • 掌握多尺度地理加权回归(MGWR):从数据到洞察的完整指南
  • 2026年众智商学院课程咨询怎么确认?正确查询官网和联系电话的方法 - 众智商学院官方
  • 如何注销自己的营业执照?营业执照注销攻略来了! - 慧办好
  • 深入解析FlexPWM:从基础原理到电机驱动实战应用
  • 2026驻马店建材行业,哪家做短视频代运营比较靠谱? - 年度推荐企业名录
  • 2026 郑州黄金回收核心门店地址指引:附近上门服务体系与耀辉全域覆盖优势 - 奢侈品回收
  • 中国电子学会图形化2021.3月Scratch四级考级题
  • 3步掌握微信数据库本地解密:隐私数据恢复与安全掌控终极指南
  • A-LOAM 与 LeGO-LOAM 特征提取前处理差异分析
  • PXS20中断控制器:软件与硬件向量模式详解及嵌入式系统中断管理实战
  • FigmaCN中文汉化插件:3分钟让Figma界面说中文的终极解决方案
  • 漫谈逆向工程
  • 2026广安装修耐用又真实的材料攻略 - 装企自媒体训练营辉哥
  • GaussDB SQL JOIN避坑指南:从‘查不到数据’到‘查出重复数据’的常见错误分析与解决
  • 2026年国内不锈钢螺旋焊管加工厂哪家强?不锈钢工业焊管厂家靠谱选择! - 资讯纵览
  • 【鸿蒙】ArkUI 自定义组件:Builder 函数与 AttributeModifier 深度解析
  • 2026更新固原市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,6月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一休咨询
  • 2026平湖海宁嘉善黄金回收铂金回收钯金回收深度实测 三城连锁门店横评 透明报价免费上门才是硬道理 - 久盈
  • 2026易学入门App推荐榜:易学排盘软件怎么选?
  • 5个步骤让Windows资源管理器轻松预览3D模型文件:终极免费指南
  • 北京婚纱照优选推荐|综合实力TOP5,榜首首选北京三川影像 - 江湖评测
  • HS2-HF_Patch:三分钟搞定游戏汉化与功能增强的终极解决方案
  • 物联网智能锁赋能短租行业:身份核验与远程授权的全链路技术落地方案
  • PVE网络配置避坑指南:从静态IP切到DHCP,这3个细节不注意小心失联!
  • 密码学基础知识(0基础小白版,超详细!!!)
  • 【Android】Room 数据库高级用法与性能调优:从查询瓶颈到毫秒级响应
  • 2026甘肃发电机租赁市场优选:从选购到服务的全流程指南 - 品研笔录
  • 2026年林芝工程承包商选型避坑指南:资质、材料、本地化能力全面对标 - 优质企业观察收录