【react】为什么 React 渲染列表时需要加上 key

为什么 React 渲染列表时需要加上 key

相关文章

为什么 React 渲染列表时需要加上 key


一、为什么 React 渲染列表时需要加上 key

在 React 中渲染列表时加上 key 是为了帮助 React 识别列表中每个元素的唯一性,并在更新过程中正确地识别、添加、移动和删除列表中的元素。这是因为 React 会根据元素的 key 来判断元素是否发生了变化,以便进行高效的更新操作。

具体来说,加上 key 的作用有以下几点:

  • 唯一性识别:key 的主要作用是帮助 React 识别列表中的每个元素的唯一性。通过 key,React 可以追踪每个元素的身份,确保在列表更新时正确地识别、添加、移动和删除元素。

  • 优化列表更新:React 使用 key 来确定元素的身份,从而进行高效的列表更新。如果列表中的元素没有 key,React 可能会遍历整个列表以确定哪些元素发生了变化,这会导致性能下降。

  • 避免重新创建元素:如果没有 key,React 可能会错误地将列表中的元素重新创建,而不是更新现有元素。这可能会导致不必要的 DOM 操作,影响性能。

  • 保持稳定性:具有相同 key 的元素在列表中的位置不发生变化时,React 会假设它们是相同的元素,并尝试对它们进行就地更新,而不是移动或重新创建它们。这有助于保持列表的稳定性。

因此,为了确保列表的正确更新和优化性能,建议在使用 React 渲染列表时为每个元素添加唯一的 key。通常情况下,可以使用列表中元素的某个唯一标识符作为 key,比如数据库中的 id。

二、示例

当渲染一个由数据驱动的列表时,我们通常会使用 map 方法将数据数组转换为一组 React 元素。在这种情况下,为了保证列表元素的唯一性,我们需要为每个列表项提供一个唯一的 key。

假设我们有一个简单的待办事项列表,每个待办事项具有一个唯一的 id 和一个文本描述。我们可以使用待办事项的 id 作为 key。下面是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import React from 'react';

function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
}

function App() {
const todos = [
{ id: 1, text: '学习 React' },
{ id: 2, text: '编写示例代码' },
{ id: 3, text: '提交作业' },
];

return (
<div>
<h1>待办事项列表</h1>
<TodoList todos={todos} />
</div>
);
}

export default App;

在上面的示例中,TodoList 组件接收一个 todos 数组作为 prop,该数组包含了待办事项的数据。在渲染列表时,我们通过 map 方法遍历 todos 数组,并为每个待办事项的 id 属性提供了一个唯一的 key。这样做可以帮助 React 正确地识别和更新列表中的每个元素。

三、使用index作为key会有什么问题

  • 不稳定的列表顺序:

    • 当列表中的元素顺序发生变化时,例如元素被插入、移除或重新排序,索引作为 key 可能无法正确地反映这些变化。
    • 如果元素的顺序改变,但其索引并未改变,React 可能会错误地认为这些元素没有发生变化,从而导致不必要的重新渲染或其他错误。
  • 可能导致组件状态丢失:

    • 如果列表中的元素重新排序或者被插入/删除,React 可能会重新创建组件实例,导致之前组件状态的丢失。
    • 这是因为 React 默认会依据组件的 key 来进行重用或者销毁组件实例,如果使用索引作为 key,可能导致 React 错误地销毁或重用错误的组件实例,从而导致组件状态的丢失。
  • 可能导致不稳定的动画效果:

    • 如果列表中的元素顺序发生变化,但是索引作为 key,可能会导致动画效果不稳定。
    • 在一些情况下,动画可能会在不同的位置之间跳跃,因为 React 将新的元素视为与之前的元素相同,而不是重新渲染新的位置。

综上所述,尽管在某些情况下使用索引作为 key 可能会更加方便,但是它可能导致一些潜在的问题,特别是在涉及到列表顺序变化、组件状态丢失和动画效果时。因此,最好的做法是尽量避免使用索引作为 key,而是选择一个稳定且在列表中唯一的标识符作为 key,以确保列表的正确渲染和更新。


喜欢这篇文章?打赏一下支持一下作者吧!
【react】为什么 React 渲染列表时需要加上 key
https://www.cccccl.com/20220308/react/为什么 React 渲染列表时需要加上 key/
作者
Jeffrey
发布于
2022年3月8日
许可协议