在映射数组时如何为 React 子项指定键

2023-11-21

我在反应联系人列表组件中有一个方法,我在其中返回另一个组件。我已经让它工作了,但我很好奇是否有更好的方法来构建我如何使用密钥。

具体来说 - 我从下面的方法中询问这行代码(数据被硬编码为示例以开始):

return <ShortContact contact={contact} key={contact.id}/>

这是上下文中的代码:

_getContacts() {
    let contactList = [
        {
            id: 1,
            fName: "aaa",
            lName: "aaaaa",
            imgUrl: "http://brainstorminonline.com/wp-content/uploads/2011/12/blah.jpg",
            email: "[email protected]",
            phone: "999999999999"
        },
        {
            id: 2,
            fName: "bbbbb",
            lName: "bbbbbbb",
            imgUrl: "https://media.licdn.com/mpr/mpr/shrinknp_200_200/bbb.jpg",
            email: "[email protected]",
            phone: "888888888888"
        },
        {
            id: 3,
            fName: "Number",
            lName: "Three",
            imgUrl: "http://3.bp.blogspot.com/-iYgp2G1mD4o/TssPyGjJ4bI/AAAAAAAAGl0/UoweTTF1-3U/s1600/Number+3+Coloring+Pages+14.gif",
            email: "[email protected]",
            phone: "333-333-3333"
        }
    ];

    return contactList.map((contact) => {
        "use strict";
        return <ShortContact contact={contact} key={contact.id}/>
    });
}

ShortContact 组件渲染:

class ShortContact extends React.Component {
    render() {
        return (
            <div >
                <li className="contact-short well whiteBG">
                    <img  className="contact-short-thumb" src={this.props.contact.imgUrl}/>
                    <p className="contact-short-name">{this.props.contact.fName}</p><br />
                    <p className="contact-short-email">{this.props.contact.email}</p>
                </li>
            </div>
        );
    }
}

我努力思考如何让它发挥作用而不收到警告Warning: Each child in an array or iterator should have a unique "key" prop.但是我想知道语法或结构是否有效以及是否应该重构。


这段代码没有任何问题。该密钥是必需的,以便反应知道如何渲染子节点。事实上你的实现正是react要求程序员做的事情。现在可以更改使用哪个密钥等详细信息,但看起来您已经拥有了性能最高的解决方案。

主要要求是密钥是唯一的,因此只要 contact.id 始终是唯一的(如果它来自数据库,那么它将是唯一的),那么就可以了。

或者,您可以使用地图上的索引作为键,但我不会真正推荐它(我将在代码片段之后解释)。

contactList.map((contact, i) => {
    return <ShortContact contact={contact} key={i}/>
});

我个人认为你的方法是最好的方法,因为它可以防止额外的渲染。我的意思是,例如,当从服务器返回新联系人时,每个联系人行都会重新呈现,因为每个联系人的数组中的索引不同(假设您没有将其视为堆栈)...该索引处具有新联系人数据的不同索引将导致重新渲染。因为 contact.id 是一个静态数字,如果该联系人的数据没有更改,那么 React 不会重新渲染它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在映射数组时如何为 React 子项指定键 的相关文章

  • 如何使用 next.js 将动态 html 元素注入到页面?

    如何使用next js动态注入html元素到页面 这些元素未知类型 例如 输入 复选框 img 使用返回 json 类型的 api 指定此元素 如下所示 id rooms title Rooms order 1 type string wi
  • Typescript 和 React:在组件之间传递 props 与默认 props

    我对 Typescript 和使用 Typescript 创建 React 应用程序相当陌生 我在将道具从一个组件传递到另一个组件时遇到了一些麻烦 我在下面提供了一个示例 我的问题是围绕组件的默认道具 当我在父组件中调用子组件时 出现错误
  • InvalidCharacterError:无法在“文档”上执行“createElement”:提供的标记名称(“/static/media/index.c6592bb6.ts”)不是有效名称

    我有一个反应应用程序 我正在尝试将其转换为使用打字稿 但我收到以下错误 InvalidCharacterError Failed to execute createElement on Document The tag name provi
  • 在 React 应用程序中简单连接到 mongodb

    我使用 create react app 创建了简单的反应应用程序 这个应用程序包含表单 验证和引导程序 没有什么花哨的东西能像魅力一样发挥作用 我还注册了 mongo 以获得免费集群 以便我可以发送一些数据 所以我有这个网址 mongod
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • Apollo 客户端延迟刷新

    In Apollo Client v3React 实现 我使用钩子来使用订阅 当我从订阅接收数据时 我想重新获取查询 但前提是查询之前已执行过并且位于缓存中 有办法实现这一点吗 我首先进行惰性查询 然后在收到订阅数据时手动检查缓存 然后尝试
  • AppBar 在 React 路由之间消失

    我有一个几乎可以工作的简单反应路由项目 我有一个AppBar and a Drawer 使用穆伊 抽屉里有三个项目 它们将重新路由应用程序 我的路由工作正常 但我遇到的问题是AppBar 因此一旦您进入某个页面 应用程序其余部分的导航就不再
  • 如何在反应中循环

    如何循环重复 这是我的代码 这是App js import React from react import App css import Child from Child Child function App return div div
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • Android:如何在播放媒体(mp3)时在特定毫秒内显示文本

    我正在尝试做一个类似卡拉 OK 的应用程序 我想在某一毫秒到来时显示一个或多个单词 例如 1148 毫秒 gt 打印 尼古拉斯 1826 毫秒 gt 打印 是 2766 毫秒 gt 打印 旧 ms gt 显示 这是我的代码 包 com ex
  • Firebase 托管部署失败

    Running firebase deploy在给我一个超时错误之前会运行几分钟Error ESOCKETTIMEDOUT 我之前已经成功部署了多次 除了项目的前端 用 React 编写 之外 没有更改任何内容 我有一个单独的文件夹 其中包
  • 从 numpy 数组中删除连续的 RGB 值

    我最初根据灰度图像的初始数组创建了一个子数组 从 numpy 数组中删除连续数字 https stackoverflow com questions 50743769 deleting consecutive numbers from a
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 如何将背景图像仅应用于一个反应页面而不是整个应用程序?

    注册页面示例 register background image linear gradient to right ff5722 0 ff9800 100 margin top 150px important div div div div
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • firebase :: 无法读取 null 的属性“props”

    你好 我正在尝试将react router与firebase一起使用 但它给了我这个错误 无法读取 null 的属性 props 这正是代码 我正在其中使用我的反应路由器 向下代码位于作为登录面板组件的组件上 else if this em
  • 摆脱node-jsx

    在我的 NodeJS 应用程序的路由器中 我想渲染一个 React 应用程序 由于它没有被浏览器化 并且已反应 因此它返回unexpected token lt 构建时出错 我发现如果我require node jsx install 它不
  • 如何在 Swiper 实例之外使用 useSwiper?

    我在用着用于 React 的滑动器 https swiperjs com react显示一些幻灯片 我一直坚持使用外部按钮在幻灯片 上一张和下一张 之间导航 刷卡器有一个useSwiper hook https swiperjs com r

随机推荐

  • 如何提取没有索引的数组的键和值[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想从数组 带有键和值的原始数组 中提取数据 提取数组后 我需要两个新数组 第一个数组仅
  • 将 backstack 与 ViewPager 结合使用

    我正在使用 ViewPager 在我的 Android 应用程序中实现滑动 但是 我希望当用户使用后退按钮而不是结束活动时显示前一个片段 有什么办法可以做到这一点吗 谢谢 塞巴斯蒂安 我有类似的问题 这就是我解决的方法 我有一个包含 6 个
  • 如何使用 python lambda 捕获异常

    假设 Python 版本 gt 3 并调用函数列表 我想编写一个处理异常的 lambda 函数 事实是 它不起作用 当函数中抛出异常时 程序返回并且调用堆栈看不到executeFunction in it 怎么办呢 def executeF
  • 检查文本文件中是否存在字符串

    所以我有 def CheckUserExists user with open C database txt r as file if re search user file read return True else return Fal
  • MySQL并发更新

    我有一个小型 POS 系统 服务器端使用 PHP 和 MySql InnoDB 当 销售 完成时 执行以下查询来更新库存数量 UPDATE products SET qty qty qty ustatus 1 WHERE pid pid 这
  • 正确使用SetThreadAffinityMask

    有 12 个核心 12 个线程正在运行 我想将 1 个线程绑定到每个核心 这就是我在每个线程的开头所说的 int core 12 SetThreadAffinityMask GetCurrentThread 1 lt
  • VBA 取消过滤范围

    我正在使用这段代码 Sheets Sheet1 AutofilterMode False 使用 VBA 取消筛选 Excel 工作表中的数据 重点是清除所有筛选器 这似乎并不总是有效 有更好的方法吗 谢谢你 如果有帮助的话 该表是从 Sql
  • 如何通过多个sudo和su命令找到原始用户?

    通过 sudo 或 su 运行脚本时 我想获取原始用户 无论是否有多个 这都应该发生sudo or su彼此内部运行 特别是sudo su Results Use who am i awk print 1 OR logname因为没有其他方
  • (通用)lisp 中的 Unix 信号处理

    我对这个主题做了一些研究 但发现了一些空白 在 Common Lisp 中似乎有依赖于实现的方法来进行 Unix 信号处理 但是是否有一个包可以提供跨实现的信号处理方法 我主要想监听 SIGINT 并在我的应用程序中正常关闭 我在 Linu
  • Apache HttpClient 4.3.5 设置代理

    看来我可以在构建 new 时指定代理HttpClient with HttpHost proxy new HttpHost someproxy 8080 DefaultProxyRoutePlanner routePlanner new D
  • 浮点相等测试和额外精度:此代码会失败吗?

    讨论开始于我对另一个问题的回答 下面的代码确定机器厄普西隆 float compute eps float eps 1 0f while 1 0f eps 1 0f eps 2 0f return eps 在评论中有人建议1 0f eps
  • 形状类似于指南针指针或 Safari 徽标的内部部分

    我正在尝试仅使用 CSS 制作以下形状 我知道使用图像或 SVG 实现此形状会容易得多 但我正在尝试使用 CSS 实现它以进行概念验证 下面是我迄今为止尝试过的代码 它通过使用创建一个菱形形状transform rotate 45deg 但
  • 在 OSX 上运行 NUnit 测试的步骤

    如何在 Mac 上运行 VS2010 中开发的 NUnit 测试 这似乎是一个非常简单和幼稚的问题 但我一直在努力寻找所有步骤 我已经通过搜索网络来找到确切的步骤来完成尽职调查 我的 Mac 上有 Mono 但没有 monodevelop
  • 为什么我不能在 Xcode 8 中使用新的内联 #imageLiteral 语法? “返回结果中的预期表达式”

    我正在尝试使用新的 imageLiteralXcode 8 中资产文件夹中的内联图像分配 而不是整个UIImage named 语法它只是显示的图像 如图所示 但是当我这样做时 当它是一个函数时 我会收到错误 返回结果中的预期表达式 这是一
  • Android 主题中的 textAllCaps

    我有一个主题 希望所有活动的文本视图都大写 所以我在样式中设置 textAllCaps 然后将其应用到我的主题中的 textViewStyle 如下所示
  • 使用 Jquery 鼠标悬停时放大图像?

    我试图在鼠标悬停时放大图像 并在鼠标移开后将尺寸缩小到正常大小 我有以下内容 image img live mouseover function var this this this attr width 25 this attr heig
  • 如何使用JPA本机查询选择多个具有相同名称的列?

    我在通过 JPA 使用 sql 本机查询选择一些数据时遇到了一些麻烦 那是因为我有 3 个具有相同名称的列 descricao 当我通过执行选择操作时创建本地查询的方法实体管理器接口找到的第一列值将覆盖其他列值 例如 当我在对象数组中得到这
  • java 方法调用的成本有多高

    我是一个初学者 我总是读到重复代码是不好的 然而 似乎为了不这样做 您通常必须进行额外的方法调用 假设我有以下课程 public class BinarySearchTree
  • 菜单上没有添加控制器,也无法在 MVC 4.5 中添加视图

    我刚刚下载了新的 nopCommerce 3 2 MVC 4 应用程序 当我在 Visual Studio 中打开解决方案时 我无法添加控制器 添加 菜单中没有 控制器 选项 当我在控制器内部右键单击时 也没有 添加视图 它似乎将解决方案中
  • 在映射数组时如何为 React 子项指定键

    我在反应联系人列表组件中有一个方法 我在其中返回另一个组件 我已经让它工作了 但我很好奇是否有更好的方法来构建我如何使用密钥 具体来说 我从下面的方法中询问这行代码 数据被硬编码为示例以开始 return