react 数组下标来作为 react组件中的key

简介: react 数组下标来作为 react组件中的key

1. 前言

  1. 为什么不能使用数组下边来作为react组件中的key
  2. vue 中也有这个问题,最好自己 写个列表 删除demo,看看效果

2. 唯一标识

  1. 在 React 中,每个组件都需要一个唯一的标识符作为 key来标识和追踪列表中的每个元素。
  2. 通常情况下,我们会选择使用字符串数字作为 key 值

3.不唯一问题

  1. 使用数组下标作为 key 的问题在于,当列表发生变化时(例如插入、删除或重新排序),数组下标会发生变化,这可能会导致不必要的重新渲染或错误的行为。

可能问题

  1. 不稳定的列表顺序:当列表发生变化时,组件的 key值会随之改变
    导致React无法正确识别跟踪每个元素的状态
    这可能导致重新渲染整个列表,即使只有一个元素发生了变化。
  2. 错误的更新行为:如果使用数组下标作为 key,而不是唯一标识符,那么当列表中的元素发生变化时,React 可能会错误地认为相同下标的元素没有发生化,导致不正确的更新行为。
  3. 复的 key 值:如果列表中的元素具有唯一的标识符,使用数组下标作为 key 可能会导致重复的 key 值。这可能会引发警告或错误,并导致不可预期的结果。

4. 示例

下标 key 数组

import React from 'react';
const ListComponent = () => {
  const items = ['Apple', 'Banana', 'Orange'];
  return (
    <ul>
      {items.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );
};
export default ListComponent;

列表 使用下标key

import React, { useState } from 'react';
import ListComponent from './ListComponent';
const App = () => {
  const [items, setItems] = useState(['Apple', 'Banana', 'Orange']);
  const handleAddItem = () => {
    setItems([...items, 'Mango']);
  };
  const handleRemoveItem = () => {
    setItems(items.slice(0, -1));
  };
  return (
    <div>
      <button onClick={handleAddItem}>Add Item</button>
      <button onClick={handleRemoveItem}>Remove Item</button>
      <ListComponent />
    </div>
  );
};
export default App;
  1. 我们点击 "Add Item" 按钮,将会在列表末尾添加一个新的元素。
  2. 然而,当我们点击"Remove Item" 按钮时,实际上是删除列表中的最后一个元素。
  3. 由于列表中的元素没有唯一的标识符,React 会错误地假设最后一个元素没有变化,从而不会进行重新渲染。
  4. 这导致删除操作不会在 UI 上反映出来,从而产生错误的结果。

5. 正确

  1. 代码

import React from 'react';
const ListComponent = () => {
  const items = [
    { id: 1, name: 'Apple' },
    { id: 2, name: 'Banana' },
    { id: 3, name: 'Orange' },
  ];
  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
};
export default ListComponent;
  • 用具有唯一性的标识符作为 key,React 可以正确识别每个元素的变化并进行准确的 diff 操作,以获得正确的更新行为。


参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
3月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
40 0
|
2月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
17 1
|
2月前
|
前端开发 JavaScript 数据库
React一般可以用哪些值作为key?
React一般可以用哪些值作为key?
|
2月前
|
前端开发 应用服务中间件 数据库
react服务端组件
react服务端组件
21 0
|
2月前
|
前端开发 JavaScript
快速上手React:从概述到组件与事件处理
快速上手React:从概述到组件与事件处理
|
3月前
|
前端开发 JavaScript API
React组件生命周期
React组件生命周期
74 1
|
3月前
|
资源调度 前端开发 JavaScript
React组件
React组件
41 0
|
3月前
|
存储 前端开发 JavaScript
探索 React Hooks 的世界:如何构建出色的组件(下)
探索 React Hooks 的世界:如何构建出色的组件(下)
探索 React Hooks 的世界:如何构建出色的组件(下)
|
3月前
|
缓存 前端开发 API
探索 React Hooks 的世界:如何构建出色的组件(上)
探索 React Hooks 的世界:如何构建出色的组件(上)
探索 React Hooks 的世界:如何构建出色的组件(上)
|
3月前
|
存储 前端开发 JavaScript
React组件中如何通讯
React组件中如何通讯
16 0