当前位置: 首页 > news >正文

【React】JSX 实现列表渲染

文章目录

    • 一、基础语法
      • 1. 使用 `map()` 方法
      • 2. `key` 属性的使用
    • 二、常见错误和注意事项
      • 1. 忘记使用 `key` 属性
      • 2. `key` 属性的选择
    • 三、列表渲染的高级用法
      • 1. 渲染嵌套列表
      • 2. 条件渲染列表项
      • 3. 动态生成组件
    • 四、最佳实践

在 React 开发中,列表渲染是一个非常常见的需求。无论是展示一组数据,还是动态生成组件,掌握列表渲染的技巧和最佳实践都是非常重要的。本文将详细介绍如何在 React 中使用 JSX 实现列表渲染,包括基础语法、常见错误以及高级用法,帮助你全面掌握这一技能。

一、基础语法

1. 使用 map() 方法

在 React 中,我们通常使用 JavaScript 的 map() 方法来迭代数组,并返回一个包含 JSX 元素的新数组。每个 JSX 元素都可以表示列表中的一项。

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =><li key={number.toString()}>{number}</li>
);const element = (<ul>{listItems}</ul>
);ReactDOM.render(element, document.getElementById('root'));

在这个示例中,numbers 数组中的每个元素都会被 map() 方法处理,并返回一个 li 元素。这些 li 元素通过 key 属性唯一标识。

2. key 属性的使用

key 是用于标识列表中每个元素的唯一性。它有助于 React 高效地更新和重新渲染列表。key 应该是一个在其兄弟元素之间唯一的字符串或数字。

const todos = ['Learn React', 'Build a React App', 'Deploy the App'];
const todoItems = todos.map((todo, index) =><li key={index}>{todo}</li>
);const element = (<ul>{todoItems}</ul>
);ReactDOM.render(element, document.getElementById('root'));

二、常见错误和注意事项

1. 忘记使用 key 属性

在渲染动态列表时,忘记添加 key 属性是一个常见错误。缺少 key 属性会导致 React 无法正确地识别和管理元素的变化。

// 错误示例:缺少 key 属性
const listItems = numbers.map((number) =><li>{number}</li>
);

2. key 属性的选择

key 属性应该尽可能唯一且稳定,不要使用数组的索引作为 key,因为当列表项重新排序时,索引会改变,从而导致潜在的渲染问题。

// 不推荐的做法:使用数组索引作为 key
const listItems = todos.map((todo, index) =><li key={index}>{todo}</li>
);// 推荐的做法:使用唯一标识符作为 key
const todos = [{ id: 1, text: 'Learn React' },{ id: 2, text: 'Build a React App' },{ id: 3, text: 'Deploy the App' }
];const todoItems = todos.map((todo) =><li key={todo.id}>{todo.text}</li>
);

三、列表渲染的高级用法

1. 渲染嵌套列表

在实际应用中,可能需要渲染嵌套列表。例如,渲染一个包含多个子项的分类列表。可以通过递归方式处理嵌套数据结构。

const categories = [{id: 1,name: 'Fruits',items: ['Apple', 'Banana', 'Orange']},{id: 2,name: 'Vegetables',items: ['Carrot', 'Broccoli', 'Spinach']}
];const CategoryList = ({ categories }) => (<ul>{categories.map(category => (<li key={category.id}>{category.name}<ul>{category.items.map(item => (<li key={item}>{item}</li>))}</ul></li>))}</ul>
);ReactDOM.render(<CategoryList categories={categories} />, document.getElementById('root'));

2. 条件渲染列表项

在渲染列表时,可以根据条件有选择地渲染特定的列表项。

const tasks = [{ id: 1, text: 'Do the dishes', completed: false },{ id: 2, text: 'Take out the trash', completed: true },{ id: 3, text: 'Mow the lawn', completed: false }
];const TaskList = ({ tasks }) => (<ul>{tasks.filter(task => !task.completed).map(task => (<li key={task.id}>{task.text}</li>))}</ul>
);ReactDOM.render(<TaskList tasks={tasks} />, document.getElementById('root'));

3. 动态生成组件

在列表渲染中,可以动态生成组件。例如,渲染一组自定义组件,每个组件都代表列表中的一项。

const products = [{ id: 1, name: 'Laptop', price: 999.99 },{ id: 2, name: 'Phone', price: 799.99 },{ id: 3, name: 'Tablet', price: 499.99 }
];const Product = ({ product }) => (<div><h2>{product.name}</h2><p>Price: ${product.price}</p></div>
);const ProductList = ({ products }) => (<div>{products.map(product => (<Product key={product.id} product={product} />))}</div>
);ReactDOM.render(<ProductList products={products} />, document.getElementById('root'));

四、最佳实践

  1. 保持数据的唯一性和稳定性

确保列表中的每个元素都有一个唯一且稳定的 key 属性,这有助于 React 更高效地更新和渲染组件。

  1. 避免使用索引作为 key

尽量不要使用数组的索引作为 key,特别是在列表项可能重新排序或删除的情况下。使用唯一标识符或对象的属性作为 key 是更好的选择。

  1. 分离数据和表现

将数据逻辑和表现逻辑分离,使代码更易于维护和理解。可以通过使用容器组件和展示组件来实现这一点。

  1. 适当地使用条件渲染

在渲染复杂列表时,可以通过条件渲染仅显示需要的部分,提高组件的性能和用户体验。

推荐我的相关专栏:

  • python 错误记录
  • python 笔记
  • 数据结构

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux进程控制——进程等待
  • WEB前端12-axios基础
  • SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)
  • Java Web应用安全防护
  • 03--KVM虚拟化
  • Python 爬虫入门(一):从零开始学爬虫 「详细介绍」
  • ES里面常用的查询语句有哪些?
  • Pytorch使用教学2-Tensor的维度
  • 探索Python的进度条神器:tqdm
  • 51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计
  • springcloud rocketmq 新增的消费者组从哪里开始消费
  • 【开发学习笔记】什么是Springboot?
  • 【AI大模型】Prompt 提示词工程使用详解
  • SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置
  • docker 构建 mongodb
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 5、React组件事件详解
  • Angular 响应式表单之下拉框
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Cumulo 的 ClojureScript 模块已经成型
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Fastjson的基本使用方法大全
  • HashMap剖析之内部结构
  • laravel5.5 视图共享数据
  • Python打包系统简单入门
  • Python利用正则抓取网页内容保存到本地
  • redis学习笔记(三):列表、集合、有序集合
  • spring学习第二天
  • Vue UI框架库开发介绍
  • Web设计流程优化:网页效果图设计新思路
  • 从tcpdump抓包看TCP/IP协议
  • 分享一份非常强势的Android面试题
  • 汉诺塔算法
  • 回流、重绘及其优化
  • 计算机常识 - 收藏集 - 掘金
  • 简单数学运算程序(不定期更新)
  • 前端设计模式
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 小程序开发中的那些坑
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 积累各种好的链接
  • ​​​​​​​​​​​​​​Γ函数
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​力扣解法汇总946-验证栈序列
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)linux使用docker容器运行mysql
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十)Flink Table API 和 SQL 基本概念