React 列表 Keys

news/2024/7/15 18:10:20 标签: react.js, javascript, 前端

列表 & Keys

列表

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

javascript"><!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 值:

javascript"><!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> 元素上。

例如,下面的写法是错误的:

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

正确的写法:

javascript">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 键。如下:

javascript"><!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 相同的值,需要将其作为属性传递。如下:

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

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

在 jsx 中嵌入 map()

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

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

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


http://www.niftyadmin.cn/n/248343.html

相关文章

LeetCode88. 合并两个有序数组

88. 合并两个有序数组 描述示例解题思路解法一&#xff08;以空间换时间&#xff09;解法二&#xff08;不需要开辟额外空间&#xff09; 描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的…

[架构之路-171]-《软考-系统分析师》-5-数据库系统-1- 数 据 库 的 控 制 功 能(并发控制、性能优化)

目录 5 . 4 数 据 库 的 控 制 功 能 5.4.1 并发控制 1 . 事务的基本概念 2 . 数据不一致问题 3 . 封锁协议 4 . 死锁问题 5.4.2 数据库性能优化 1 . 硬件升级 2 . 数据库设计 5.4.3 数据库的完整性 1 . 完整性约束条件 2 . 实体完整性 3 . 参照完整性 4 . 用户定…

苦中作乐 ---竞赛刷题11-20(15-20)

&#xff08;一&#xff09;目录 1. L1-011 A-B 2. L1-015 跟奥巴马一起画方块 3.L1-016 查验身份证 4.L1-017 到底有多二 5.L1-019 谁先倒 6.L1-020 帅到没朋友 &#xff08;二&#xff09;题目 L1-011 A-B 本题要求你计算A−B。不过麻烦的是&#xff0c;A和B都是字符串…

EBS R12.1 注册客户化应用的步骤

创建客户化应用目录 登录成 applxxx 用户 -- applxxx 改成所需用户名 # 以标准INV模块作为客户化应用目录的模板 cd $APPL_TOP mkdir -p cust cp -r inv cust/template cd cust # 删除template 目录下的文件&#xff0c;只保留目录结构 cd $APPL_TOP/cust for rm_list in …

【软件测试】四面成功上岸美团

最后&#xff0c;总结一下个人认为比较重要的知识点&#xff1a;接口自动化测试 &#xff1a;测试框架&#xff0c;多个有关联的接口的用例编写&#xff0c;用例的组织及存储&#xff0c;接口测试的覆盖率&#xff0c;RESTAssured 的封装等。UI 自动化测试 &#xff1a;iOS 和 …

ios客户端学习笔记(四):学习Swift的网络编程

在iOS应用程序开发中&#xff0c;网络编程是非常重要的。Swift提供了多种网络编程框架&#xff0c;如NSURLSession、Alamofire等。你需要学习如何使用这些框架来进行网络通信&#xff0c;包括数据的请求、响应和解析等。 1. NSURLSession NSURLSession是iOS中的一个网络编程框…

高端风再起,小爱、小度发新芽?

前段时间&#xff0c;一则“叮咚智能音箱停止后续运营服务”的消息引发不少人对智能音箱市场的唏嘘之声&#xff0c;有关于行业“走到头”的议论甚嚣尘上。 仔细深究来看&#xff0c;外界看衰智能音箱行业或许并不单单是因为叮咚离场&#xff0c;更大原因是对智能音箱市场前景没…

vue_03

文章目录 导航菜单功能的实现在Admin.vue中添加下列代码布局选择点击跳转事件 vuex的安装及配置安装配置新建store和index.js在index.js下写如下代码在main.js中引入store 封装菜单请求工具类新建menus.js编写menus.js文件 解决F5刷新数据丢失问题 导航菜单功能的实现 在Admin…