【React】JSX 实现列表渲染

news2024/11/15 11:35:44

文章目录

    • 一、基础语法
      • 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 笔记
  • 数据结构

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1949963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

家政项目小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;家政人员管理&#xff0c;家政服务管理&#xff0c;咨询信息管理&#xff0c;咨询服务管理&#xff0c;家政预约管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能…

LeetCode 637, 67, 399

文章目录 637. 二叉树的层平均值题目链接标签思路代码 67. 二进制求和题目链接标签思路代码 399. 除法求值题目链接标签思路导入value 属性find() 方法union() 方法query() 方法 代码 637. 二叉树的层平均值 题目链接 637. 二叉树的层平均值 标签 树 深度优先搜索 广度优先…

nginx 启动 ssl 模块

文章目录 前言nginx 启动 ssl 模块1. 下载2. 启动 ssl 模块 步骤3. 验证前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! nginx 启动 ssl 模块 1. 下载 下载…

STM32智能家居控制系统教程

目录 引言环境准备智能家居控制系统基础代码实现&#xff1a;实现智能家居控制系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;家居监测与优化问题解决方案与优化收尾与总结 1. 引言 智能家居控制系统通…

PHP多场地预定小程序系统源码

一键畅游多地&#xff01;多场地预定小程序的超实用指南 段落一&#xff1a;【开篇&#xff1a;告别繁琐&#xff0c;预订新体验】 &#x1f389;&#x1f680; 还在为多个活动或会议的场地预订而头疼不已吗&#xff1f;多场地预定小程序来拯救你啦&#xff01;它像是一位贴心…

GPU虚拟化和池化技术解读

GPU虚拟化到池化技术深度分析 在大型模型的推动下&#xff0c;GPU算力的需求日益增长。然而&#xff0c;企业常常受限于有限的GPU卡资源&#xff0c;即使采用虚拟化技术&#xff0c;也难以充分利用或持续使用这些资源。为解决GPU算力资源的不均衡问题&#xff0c;同时推动国产…

【Qt 】JSON 数据格式详解

文章目录 1. JSON 有什么作用?2. JSON 的特点3. JSON 的两种数据格式3.1 JSON 数组3.2 JSON 对象 4. Qt 中如何使用 JSON 呢&#xff1f;4.1 QJsonObject4.2 QJsonArray4.3 QJsonValue4.4 QJsonDocument 5. 构建 JSON 字符串6. 解析 JSON 字符串 1. JSON 有什么作用? &#x…

C++中的继承与多态1

目录 C中的继承与多态1 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂…

农田环境监测系统—有助于维护农田生态平衡

TH-NQ8农田环境监测系统是一种专为农业领域设计的高科技设备&#xff0c;它通过实时监测农田环境的各项指标&#xff0c;为农业生产提供科学依据&#xff0c;有力地推动了农业的可持续发展。以下是对农田环境监测系统的详细介绍&#xff1a; 系统组成 农田环境监测系统主要由以…

前端学习7——自学习梳理

​​​​​​jQuery 教程 | 菜鸟教程jQuery 教程 jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 jQuery 很容易学习。 本章节的每一篇都包含了在线实例 通过本站的在线编辑器&#xff0c;你可以在线运行修改后的代码&#xff0c;并查看运行结果。 实例…

手持式气象检测设备:便携科技,气象探测

一、手持式气象检测设备&#xff1a;小巧身躯&#xff0c;大能量 手持式气象检测设备&#xff0c;顾名思义&#xff0c;是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器&#xff0c;能够实时获取气象数据&#xff0c;并通过显示屏或手机APP…

聊聊最近很火的13.11和13.8到底谁大?

在最近我是歌手的排名统计中&#xff0c;出现了以下这一幕&#xff1a; 部分网友提出质疑&#xff0c;说是13.11大于13.8&#xff1a; 那么我们肉眼去看&#xff0c;根据我们12年义务教育去比对&#xff0c;肯定是13.8更大一些&#xff0c;但是这样一道简单的数学题还难倒了不少…

java数据结构之排序

前言&#xff1a; 排序在我们日常生活中随处可见&#xff0c;这里将介绍java数据结构里面常见的几种排序。 ps: swap函数的实现&#xff1a; public void swap(int[] arr, int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; } 1.直接插入排序 &#xff08;1&a…

如何使用内网穿透为本地部署的开源虚拟机平台Proxmox VE配置公网地址

文章目录 前言1. 局域网访问PVE2. 安装Cpolar 工具3. 创建PVE公网地址4. 远程访问PVE5. 设置固定域名6. 固定地址访问 前言 本文主要介绍如何在Windows环境安装内网穿透工具&#xff0c;实现公网环境远程访问本地局域网中的Proxmox VE平台WEB 管理界面。 Proxmox VE是一个完全…

什么是互联网?

什么是互联网&#xff1f;互联网是由什么组成的&#xff1f;我们身处一个怎样的网络环境&#xff1f;相信很多人其实都无法回答。互联网起始于1969年&#xff0c;至今已经发展为一个极其庞大的全球网络&#xff0c;没有人能够详细描述其全貌。 我觉得这是一个特别奇怪的现象&a…

Nestjs使用Redis的最佳实践

前几天在项目中有用到Redis JWT实现服务端对token的主动删除(退出登录功能)。故此介绍下如何在Nestjs中使用Redis&#xff0c;并做下总结。 知识准备 了解Redis - 网上很多简介。了解Nestjs如何使用jwt生成token - 可移步看下我之前的文章 效果展示 一、mac安装与使用 示…

生成式AI的双重路径:Chat与Agent的融合与竞争

文章目录 每日一句正能量前言整体介绍对话系统&#xff08;Chat&#xff09;自主代理&#xff08;Agent&#xff09;结论 技术对比技术差异优势与劣势技术挑战结论 未来展望发展趋势Chat与Agent的前景社会和经济影响结论 后记 每日一句正能量 在避风的港湾里&#xff0c;找不到…

若依ruoyi+AI项目二次开发

//------------------------- //定义口味名称和口味列表静态数据 const dishFlavorListSelectref([ {name:"辣度",value:["不辣","微辣","中辣","重辣"]}, {name:"忌口",value:["不要葱","不要…

ADG901解析

目录 一、特性二、增强产品特性三、应用四、一般描述五、极低功耗六、引脚描述七、尺寸参数八、电路连接一、特性 宽带开关:-3 dB 在 4.5 GHz吸收型开关高关断隔离度:在 1 GHz 时为 38 dB低插入损耗:在 1 GHz 时为 0.8 dB单一 1.65 V 至 2.75 V 电源CMOS/LVTTL 控制逻辑小巧…

AI无处不在,英特尔举办第十七届网络与边缘计算行业大会,推动边缘AI深度融合

AI正在成为全行业的技术热潮。CSDN 看到&#xff0c;AI正在引发计算、开发、交互三大范式的全面升级&#xff0c;技术开发或将迎来一次全新的科技变革周期。国际权威的分析机构数据也一致显示了AI的快速增长之势。据IDC数据&#xff0c;中国生成式AI的复合年增长率达到86.2%&am…