React 列表 & Keys

2023-05-16

列表 & Keys

列表

React 列表可以使用 JavaScriptmap() 方法来创建。如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>React demo</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="example"></div>

<script type="text/babel">
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((numbers) =>
  <li>{numbers}</li>
);

ReactDOM.render(
  <ul>{listItems}</ul>,
  document.getElementById('example')
);
</script>

</body>
</html>

页面效果:
在这里插入图片描述

但是,可以看到控制台有报错:
在这里插入图片描述

意思就是,每个数组或迭代器中的子元素应该有一个唯一的 “key” 值。

Keys

修改代码,给每个子元素加上唯一的 key 值:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>React demo</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="example"></div>

<script type="text/babel">
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];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('example')
);
</script>

</body>
</html>

当在 map() 方法的内部调用元素时,应该为每一个元素加上一个独一无二的 key,这样就不会报错啦。

总结:

  • Keys 可以在 DOM 中的某些元素被增加或删除的时候帮助 React 识别哪些元素发生了变化。因此,应当给数组中的每一个元素赋予一个确定的标识。
  • 一个元素的 key 最好是这个元素在列表中拥有的一个独一无二的字符串。通常,我们使用来自数据的 id 作为元素的 key
  • 当元素没有确定的 id 时,可以使用他的序列号索引 index 作为 key;如果列表可以重新排序,不建议使用索引来进行排序,因为这会导致渲染变得很慢。

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>
  );
}

正确的写法:

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>
  );
}

key 的唯一性

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>React demo</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="example"></div>

<script type="text/babel">
function Blog(props) {
  const titlebar = (
    <ul>
      {props.arr.map((item) =>
        <li key={item.id}>
          {item.title}
        </li>
      )}
    </ul>
  );
  const contentbar = props.arr.map((item) =>
    <div key={item.id}>
      <h1>{item.title}</h1>
      <p>{item.content}</p>
    </div>
  );
  return (
    <div>
      {titlebar}
      <hr />
      {contentbar}
    </div>
  );
}

const posts = [
  {id: 1, title: 'title 1', content: 'This is title 1!'},
  {id: 2, title: 'title 2', content: 'This is title 2!'}
];
ReactDOM.render(
  <Blog arr={posts} />,
  document.getElementById('example')
);
</script>

</body>
</html>

页面效果:
在这里插入图片描述

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

  const contentbar = arr.map((item) =>
    <Post key={item.id} id={item.id}/>
  )

Post 组件可以读出 props.id,但是不能读出 props.key

在 jsx 中嵌入 map()

JSX 允许在大括号中嵌入任何表达式,可以在里面嵌入 map()

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

不过,如果一个 map() 嵌套了太多层级时,就应该提取出组件。

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

React 列表 & Keys 的相关文章

  • 对Fiber架构的理解?解决了什么问题?

    一 问题 JavaScript引擎和页面渲染引擎两个线程是互斥的 当其中一个线程执行时 另一个线程只能挂起等待 如果 JavaScript 线程长时间地占用了主线程 那么渲染层面的更新就不得不长时间地等待 界面长时间不更新 会导致页面响应度
  • 虚拟列表的实现思路(附带react代码)

    虚拟列表实现思路 代码链接 div class 滚动容器 div class 撑起列表正常高度 div div class 列表容器 div class 列表项 div div div 1 列表项 的高度确定 2 利用 滚动容器 的高度计算
  • React仿写网易云音乐项目

    文章目录 一 项目功能说明 二 最终效果 三 文件目录结构说明 四 项目技术栈 五 核心技术 1 配置项目别名 craco craco 2 使用reset css进行 css 重置 3 使用CSS Sprites 精灵图 4 使用 memo
  • React Router 路由守卫

    React Router 路由守卫 组件内路由守卫 1 下面是使用高阶组件实现路由守卫的示例代码 import React from react import Route Redirect from react router dom con
  • state和props的区别__react

    首先说明 state和props是每个组件都有的 其次 state可变 但props不可变 这是官网给出的说法 但实操过程中 state的确可变 但props也可以变 是不是fb搞错了 当然不是 这里的可变与不可变 说的是改变后 是否会重新
  • 【前端】react-markdown配置解析

    文章目录 react markdown基本配置 同步预览配置 MdEditorComponent js reducer js initBlogState js action types js sync actions js store js
  • React的State Hook用法详解

    一 State Hook是啥 State Hook 就是指 useState 这个特殊函数 让你不用编写class 就可以使用state特性 换言之就是让 函数组件 拥有 state 特性 对数据进行动态更新 二 class中的state
  • 在校学生如何白嫖黑群辉虚拟机和内网穿透,实现海量资源的公网访问?(小白专用)

    文章目录 前言 本教程解决的问题是 按照本教程方法操作后 达到的效果是 前排提醒 1 搭建群辉虚拟机 1 1 下载黑群辉文件 vmvare虚拟机安装包 1 2 安装VMware虚拟机 1 3 解压黑 群辉虚拟机文件 1 4 虚拟机初始化 1
  • 配置使用Eslint的时候 版本错误 "eslint": "5.6.0" a different version of eslint was detected higher up in the tr

    1 如果你也遇到下面的问题 你可以 按照命令行提示的那样 下面这四步完成的一般就可以了 但是不排除你在运行的时候忘记下载某些依赖 1 删除 package lock json 不是package json 你可以选择 yarn lock 或
  • React页面设计初体验

    1 定制路由 export default login path login name login component layouts BlankLayout routes path login component Login Index
  • 组件间样式覆盖问题--CSS Modules

    1 组件间样式覆盖问题 问题 CityList 组件的样式 会影响 Map 组件的样式 原因 在配置路由时 CityList 和 Map 组件都被导入到项目中 那么组件的样式也就被导入到项目中了 如果组件之间样式名称相同 那么一个组件中的样
  • 一文揭秘饿了么跨端技术的演进、实践与落地

    本文会先带领大家一起简单回顾下跨端技术背景与演进历程与在这一波儿接着一波儿的跨端浪潮中的饿了么跨端现状 以及在这个背景下 相较于业界基于 React Vue 研发习惯出发的各种跨端方案 饿了么为什么会选择走另外一条路 这个过程中我们的一些思
  • React-(4)React中的事件绑定

    React中的事件绑定 在 React 组件中 每个方法的上下文都会指向该组件的实例 即自动绑定 this 为当前组件 而且 React 还会对这种引用进行缓存 以达到 CPU 和内存的最优化 在使用 ES6 classes 或者纯函数时
  • Ant Design Pro从零到一(认识AntD)

    废话 在我们第一次接触AntD的时候 会遇到两个东西 一个是Ant Design 另一个是Ant Design Pro 他们的官网分别是 Ant Design 一套企业级 UI 设计语言和 React 组件库 Ant Design Pro
  • react之纯函数、函数组件、类组件、纯组件

    一 纯函数 Pure Function 定义 一个函数的返回结果只依赖于它的参数 并且在执行的过程中没有副作用 我们就把该函数称作纯函数 特点 1 函数的返回结果只依赖与它的参数 同一个输入只能有同一个输出 let foo a b gt a
  • useEffect详情用法

    1 为什么要使用useEffect 想必大家都是用过vue吧 在vue框架所写的项目中 我们通过在与后端进行数据交互的过程中 通常都是会在生命周期中进行数据的请求 然后将数据返回给页面进行渲染 在React中我们也是这样 但是在函数式组件中
  • React class组件、react-hook函数组件分别实现五子棋

    react class类组件 react hook函数组件分别实现五子棋 前言 使用create react app脚手架简单搭建 不用安装其他依赖 纯 js css实现 这里就只是简单的说明目录结构和思路 具体的代码实现请转到 Githu
  • 如何替换对象的key值

    发生的场景 现在用antd组件库 有些组件想渲染数据的话 我要根据他们官网给的字段名称对应起来才能渲染上去 这个是复选框选中 保存的时候 字段需要按照后台约定的传入code value 1 常规循环遍历 大招来了 哈哈哈 才疏学浅 我觉得是
  • reactJS 干货(reactjs 史上最详细的解析干货)

    一 State和 Props state是状态机 应该包括 那些可能被组件的事件处理器改变并触发用户界面更新的数据 譬如需要对用户输入 服务器请求或者时间变化等作出响应 不应该包括 计算所得数据 React组件 在render 里使用pro
  • 黑马React:基础拓展

    黑马React D10 基础拓展 Date December 18 2023 useReducer 基础使用 作用 让 React 管理多个 相对关联 的状态数据 补充 和useState的作用类似 用来管理相对复杂的状态数据 特点 use

随机推荐

  • C_C++变量命名规则

    C C 43 43 变量命名规则 变量命名规则是为了增强代码的可读性和容易维护性 以下为C 43 43 必须遵守的变量命名规则 xff1a 1 变量名只能是字母 xff08 A Z xff0c a z xff09 和数字 xff08 0 9
  • Git 初次提交代码

    Git 初次提交发布代码 首先打开 bash 出现git的命令行 可以在GitHub上新建一个仓库 这是提交了的代码的仓库 xff0c 刚创建的时候只有 README md 和 gitignore 两个文件 xff01 在进入git的命令行
  • MATLAB 快速绘制曲线图的形状,粗细,颜色

    目录 MATLAB 快速绘制曲线图的形状 xff0c 粗细 xff0c 颜色1 通过改变R G B 的值改变线条的颜色 xff1a 2 通过改变c 1 43 的值改变线条的粗细 xff1a 3 线条形状 xff0c 粗细 xff0c 颜色选
  • STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

    摘自 xff1a STM32F103五分钟入门系列 xff08 一 xff09 跑马灯 xff08 库函数 43 寄存器 xff09 43 加编程模板 43 GPIO总结 作者 xff1a 自信且爱笑 发布时间 xff1a 2021 04
  • Git的安装(附安装包)

    目录 使用目的关于Git的历史Git的安装1 运行安装包 xff0c 点击next2 选择安装路径 xff0c 下一步3 点击next4 设置开始菜单 xff0c 默认next5 点击next6 选择git的方式7 剩下所有步骤均默认即可8
  • GPIO输入输出模式原理(八种工作方式附电路图详解)

    这几篇博文讲的不错 xff0c 可参照着理解 xff1a STM32下拉输入模式与振动传感器的使用 上拉电阻与下拉电阻 通俗解读 上 下拉电阻 xff08 定义 强弱上拉 常见作用 吸电流 拉电流 灌电流 xff09 个人总结 xff1a
  • 树莓派接入公网(花生壳)

    参考 xff1a 树莓派接入公网 作者 xff1a 图触靓 发布时间 xff1a 2020 12 22 17 28 19 网址 xff1a https blog csdn net bhbhhyg article details 107994
  • 深入理解STM32内存管理

    参考 xff1a 详解ROM和RAM 作者 xff1a 嵌入式实验楼 网址 xff1a https mp weixin qq com s y2aG7kX 6CTyeMzEJW YHw 内存相关博文 xff1a 1 内存四区 xff08 代码
  • React Props

    state 和 props 主要的区别在于 props 是不可变的 xff0c 而 state 可以根据与用户交互来改变 所以 xff0c 有些容器组件需要定义 state 来更新和修改数据 而子组件只能通过 props 来传递数据 pro
  • Chrome如何下载网页视频

    目录 第一步 xff1a 右键 xff0c 选择 检查 指令 xff0c 进入代码控制面板第二步 xff1a 单击代码面板左上角红色标出来的按钮 xff0c 然后鼠标移到左边视频上第三步 xff1a 双击src后面的代码 xff08 全部展
  • MODBUS通讯协议详解(基于485)

    参考 xff1a 灵育科技Modbus课程总结 作者 xff1a Naunyang 时间 xff1a 2020 11 23 13 51 58 网址 xff1a https blog csdn net Naunyang article det
  • 步进电机、伺服电机、舵机、无刷电机、有刷电机区别

    参考 xff1a 步进电机 伺服电机 舵机的原理和区别 xff1f Vincross的回答 知乎 地址 xff1a https www zhihu com question 37374664 answer 167299936 目录 什么是电
  • 面经——嵌入式常见面试题总结100题(下)

    参考 xff1a 嵌入式常见面试题总结 xff08 1 xff09 作者 xff1a 天泉证道 发布时间 xff1a 2018 11 08 09 33 43 网址 xff1a https guoyanzhang blog csdn net
  • 4种整流电路、5种滤波电路

    目录 基本电路变压电路整流电路半波整流电路全波整流电路桥式整流电路倍压整流电路 滤波电路电容滤波电路电感滤波电路RC滤波电路LC滤波电路有源滤波电路 整流滤波电路总结常用整流电路性能对照常用无源滤波电路性能对照电容滤波电路输出电流大小与滤波
  • 焊接技巧(热风枪/QFP/QFN/SOP/穿孔/烙铁头/助焊膏/连锡/飞线/回流焊)

    https www bilibili com video BV1wJ411B73v p 61 1 amp vd source 61 cc0e43b449de7e8663ca1f89dd5fea7d
  • C语言如何跳出多重循环

    目录 前言一 题目示例二 解决方法1 使用goto语句2 使用状态标志 总结 参考 xff1a https blog csdn net qq 45797595 article details 122278580 ops request mi
  • 第一个hadoop入门程序WordCount

    要导入hadoop文件夹中share下的common文件夹中的几个包和lib下的包 xff0c 以及mapreduce中相应的包 package com yootk mr demo import java io IOException im
  • 4种版本控制工具

    1 Visual Source Safe VSS xff09 VSS是美国微软公司的产品 xff0c 是配置管理的一种很好的入门级的工具 xff08 window系统 xff09 VSS的配置管理的功能比较基本 xff0c 提供文件的版本跟
  • 1. STM32学习 STM32综述

    什么是STM32 STM32是ST公司基于ARM Cortex M内核开发的32位微控制器 MCU 学习使用的是STM32F1系列 xff0c 内核为Cortex M3 STM32功能强大 性能优异 片上资源丰富 功耗低 xff0c 是一款
  • React 列表 & Keys

    列表 amp Keys 列表 React 列表可以使用 JavaScript 的 map 方法来创建 如下 xff1a span class token operator lt span span class token operator