使用 map() 方法将数组数据渲染为 React 元素列表,理解 key 的重要性。

示例 1: 基本列表渲染

  • 1. React
  • 2. Vue
  • 3. Angular
  • 4. Svelte
  • 5. Solid
const frameworks = ["React", "Vue", "Angular"];

{frameworks.map((item, index) => (
  <li key={item}>{index + 1}. {item}</li>
))}

示例 2: 对象数组渲染

张三

zhangsan@example.com

admin

李四

lisi@example.com

user

王五

wangwu@example.com

guest
interface User {
  id: number;
  name: string;
  email: string;
}

{users.map(user => (
  <UserCard key={user.id} user={user} />
))}
Key 选择: 使用数据的唯一标识符(如 id)作为 key,而不是数组索引。

示例 3: 过滤和排序

AirPods Pro配件
¥1899
Apple Watch配件
¥2999
iMac电脑
¥10999
iPad Air平板
¥4799
iPhone 15手机
¥6999
MacBook Pro电脑
¥12999
const result = products
  .filter(p => p.name.includes(filter))
  .sort((a, b) => a.price - b.price);

{result.map(item => <Item key={item.id} />)}

示例 4: 分组列表

待办(2)
构建项目
写单元测试
进行中(2)
🔄 练习 Hooks
🔄 代码审查
已完成(2)
学习 React 基础
学习 TypeScript
const grouped = tasks.reduce((acc, task) => {
  acc[task.status].push(task);
  return acc;
}, { todo: [], doing: [], done: [] });

{Object.entries(grouped).map(([status, items]) => (
  <section key={status}>
    <h2>{status}</h2>
    {items.map(item => <Item key={item.id} />)}
  </section>
))}

示例 5: Key 的重要性

key=1
key=2
key=3
实验:
  1. 在输入框中修改文字
  2. 点击"添加到开头"或"随机排序"
  3. 对比使用 id 和 index 作为 key 的区别

使用 index 时,输入框的内容会错位,因为 React 认为是相同的元素!

示例 6: Fragment 与多元素

JSX
JavaScript XML,React 的语法扩展
Props
组件的输入参数
State
组件的内部状态
import { Fragment } from 'react';

{glossary.map(item => (
  <Fragment key={item.id}>
    <dt>{item.term}</dt>
    <dd>{item.definition}</dd>
  </Fragment>
))}
注意:当需要返回多个元素但不想添加额外 DOM 节点时,使用 Fragment。 简写 <></> 不能添加 key,必须用完整的 Fragment。

示例 7: 动态列表操作

  • 项目 1id: 1
  • 项目 2id: 2
操作说明: 添加、删除、上移项目。注意观察 id 保持不变。