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

第八部分:第四节 - 列表渲染与条件渲染:根据订单显示不同内容

在构建用户界面时,经常需要根据数据动态地渲染内容,比如显示一个列表(菜单列表、订单列表)或者根据条件显示/隐藏某个元素(库存不足提示、登录/注册按钮)。React 提供了灵活的方式来处理这些场景。这就像点餐系统需要根据后台传来的菜单数据动态生成菜品列表,或者根据菜品的库存状态显示“有货”或“售罄”。

渲染列表数据 (map 方法):

在 React 中渲染一个数据列表,最常用的方法是使用 JavaScript 数组的 map() 方法。map() 方法遍历数组中的每个元素,并为每个元素返回一个 React 元素(通常是 JSX)。

// src/components/MenuList.jsx
import React from 'react';
import MenuItem from './MenuItem'; // 导入 MenuItem 组件function MenuList({ menuItems }) { // 接收菜品数组作为 propsreturn (<div><h2>菜单</h2><ul>{/* 使用 map 方法遍历 menuItems 数组 */}{menuItems.map(item => (// 为列表中的每个元素渲染一个 MenuItem 组件// !! key 属性非常重要 !!<MenuItem key={item.id} name={item.name} price={item.price} />))}</ul></div>);
}export default MenuList;

key 属性:

在渲染列表时,为每个列表项提供一个唯一且稳定的 key 属性非常重要的。key 帮助 React 识别哪些列表项发生了变化、被添加或被删除。这有助于 React 高效地更新虚拟 DOM 和实际 DOM,提高性能。

  • key 的值应该是列表中每个项的唯一标识符,比如数据库记录的 ID。
  • 避免使用数组索引作为 key,除非列表项的顺序永不改变,且列表不会被添加或删除项。
// 避免使用索引作为 key (除非万不得已)
// menuItems.map((item, index) => (
//   <MenuItem key={index} name={item.name} price={item.price} />
// ))

条件渲染:

根据条件显示或隐藏组件或元素。

  1. 使用 if/else (在函数组件内部):
    function Greeting({ isLoggedIn }) {if (isLoggedIn) {return <h1>欢迎回来!</h1>;} else {return <h1>请先登录。</h1>;}
    }
    
  2. 使用三元运算符 (condition ? true : false): 适合简单的条件渲染。
    function Greeting({ isLoggedIn }) {return (<h1>{isLoggedIn ? '欢迎回来!' : '请先登录。'}</h1>);
    }
    
  3. 使用逻辑 && (如果条件为真则渲染): 适合只需要在条件为真时渲染某个元素。
    function Status({ isLoading }) {return (<div>{isLoading && <p>正在加载数据...</p>} {/* isLoading 为真时显示加载信息 */}{!isLoading && <p>数据已加载。</p>}  {/* isLoading 为假时显示加载完成信息 */}</div>);
    }
    
  4. 使用元素变量: 将条件渲染的结果赋值给一个变量,然后在 JSX 中使用该变量。
    function LoginControl({ isLoggedIn, onLoginClick, onLogoutClick }) {let button;if (isLoggedIn) {button = <button onClick={onLogoutClick}>退出</button>;} else {button = <button onClick={onLoginClick}>登录</button>;}return (<div>{button} {/* 使用变量来渲染 */}</div>);
    }
    

小例子:渲染菜单列表和显示加载状态

// src/App.jsx (修改)
import React, { useState } from 'react';
import './App.css';
import MenuList from './components/MenuList';function App() {const [isLoading, setIsLoading] = useState(true);const [menuItems, setMenuItems] = useState([]);// 模拟异步获取菜单数据React.useEffect(() => {setTimeout(() => {const fetchedMenuItems = [{ id: 1, name: '宫保鸡丁', price: 38 },{ id: 2, name: '鱼香肉丝', price: 35 },{ id: 3, name: '麻婆豆腐', price: 28 },];setMenuItems(fetchedMenuItems);setIsLoading(false);}, 2000); // 模拟 2 秒加载时间}, []); // 依赖数组为空,只在组件挂载时运行一次return (<div className="App"><h1>我们的特色菜单</h1>{/* 条件渲染:如果正在加载,显示加载信息 */}{isLoading && <p>菜单加载中,请稍候...</p>}{/* 条件渲染:如果加载完成且有菜品,渲染菜单列表 */}{!isLoading && menuItems.length > 0 && (<MenuList menuItems={menuItems} />)}{/* 条件渲染:如果加载完成但没有菜品 */}{!isLoading && menuItems.length === 0 && (<p>暂无菜品可用。</p>)}</div>);
}export default App;

小结: 使用 map 方法和唯一的 key 属性是 React 中渲染列表的标准做法,它帮助 React 高效地更新 UI。条件渲染允许你根据不同的条件灵活地显示或隐藏 UI 元素,常用的方式包括 if/else、三元运算符和逻辑 &&

练习:

  1. 在你的 my-restaurant-app 项目中,创建一个包含任务对象的数组 (每个对象包含 id, text, isCompleted 属性)。
  2. 创建一个新的组件 TaskList.jsx,接收任务数组作为 Props。
  3. TaskList 组件中,使用 map 方法渲染任务列表,为每个任务显示文本。如果任务 isCompletedtrue,则在文本旁边显示一个“√”标记。确保为每个任务项提供唯一的 key 属性。
  4. 修改你的 MenuItem 组件,接收一个 stock (数字) Props。使用条件渲染,如果 stock 小于 5,则在菜品价格旁边显示一个“库存紧张!”的提示。
http://www.xdnf.cn/news/12057.html

相关文章:

  • [Java 基础]类,面向对象的蓝图
  • Windows 下载、安装、配置和使用Node
  • BUU MISC(持续更新)
  • Java 中实现线程的创建和启动
  • [ACM MM 2024]Lite-Mind:Towards Efficient and Robust Brain Representation
  • MySQL对数据库用户的操作
  • VS Code开发项目,配置ESlint自动修复脚本
  • 高防CDN有用吗?它的防护效果怎么样?
  • 1. 数据库基础
  • 卫星的“太空陀螺”:反作用轮如何精准控制姿态?
  • 蓝桥云课ROS一键配置teb教程更新-250604
  • 嵌入式就业难不难?
  • 【趣味Html】第11课:动态闪烁发光粒子五角星
  • 力扣刷题Day 70:在排序数组中查找元素的第一个和最后一个位置(34)
  • Visual Studio 2022 在 Windows 11 添加资源时崩溃问题分析与解决方案
  • [Linux] Linux GPIO应用编程深度解析与实践指南(代码示例)
  • JAVA实战开源项目:医院药品管理系统 (Vue+SpringBoot) 附源码
  • 数组1 day7
  • zabbix 6 监控 docker 容器
  • Linux 库文件的查看和管理
  • 解决 Java 项目中 “zip END header not found“ 错误
  • 【el-progress】element UI 进度条组件
  • 易基因:贵州省医刘代顺团队MeRIP-seq揭示m6A修饰在病毒感染中的免疫调控作用 | 项目文章
  • AI Agent 能否理解人类的行为和决策?
  • Java - 数组
  • 【docker】Windows安装docker
  • [Java 基础]抽象类和接口
  • 马尔可夫链(Markov Chain)和马尔可夫决策过程(Markov Decision Process, MDP)
  • ST语言控制电机往返运动
  • Flink进阶之路:解锁大数据处理新境界