
在react开发中,从外部api获取数据并根据数据状态(加载中、数据已就绪)进行条件渲染是常见的需求。然而,不当的状态管理和渲染逻辑可能导致数据获取成功后,ui却未能按预期更新。本教程将详细解析这一问题,并提供一套健壮的解决方案。
在提供的原始代码中,数据获取后组件未能正确渲染,主要源于以下两个核心问题:
React的状态(State)应当被视为不可变的。这意味着当State包含数组或对象时,不应该直接修改它们,而是应该创建新的数组或对象来替换旧的。
原始代码片段:
const [state, setState] = useState({users: []});
const temporaryUsers = state.users; // temporaryUsers 引用了 state.users
useEffect(() => {
fetch(`https://randomuser.me/api/?results=20`)
.then(res => res.json())
.then(json => {
temporaryUsers.push(json); // 直接修改了 state.users 数组
setState({
users: temporaryUsers // 传入的是旧数组的引用,React可能无法检测到变化
});
});
},[])这里的问题在于:
此外,API返回的数据结构通常是 json.results,而不是直接 json。将整个 json 对象推入 users 数组会导致 state.users[0] 实际上是 { results: [...] },而不是直接的 User 对象数组。
原始代码使用了一个立即执行的匿名函数(IIFE)来进行条件渲染:
{(() => {
if (state.users[0] != undefined){
state.users[0].results.map((elem) => {
return(
<User props={elem} />
)
})
} else{
return (
<p>Loading...</p>
)
}
})()}尽管IIFE可以用于条件渲染,但这里存在一个关键问题:if (state.users[0] != undefined) 分支中的 map 函数返回了一个JSX元素数组,但这个数组并没有被IIFE 返回。这意味着当条件满足时,IIFE的执行结果是 undefined,因为 map 内部的 return 语句只作用于 map 的回调函数,而不是IIFE本身。因此,React无法渲染任何内容。
为了解决上述问题,我们需要遵循React的状态管理原则,并采用更简洁、高效的条件渲染方式。
当更新数组或对象类型的State时,始终创建并返回一个新的数组或对象。
YouMind
AI内容创作和信息整理平台
207
查看详情
// 错误示范:直接修改并传入引用
// temporaryUsers.push(json);
// setState({ users: temporaryUsers });
// 正确示范:创建新数组并更新
setState({ users: json.results }); // 假设json.results是用户数据数组通过 setState({ users: json.results }),我们直接将从API获取到的 json.results 赋值给 users 属性,users 属性现在引用了一个全新的数组对象。React能够检测到这个引用变化,从而触发组件的重新渲染。
对于简单的条件渲染,React推荐使用三元运算符(condition ? true_expr : false_expr)或逻辑与运算符(condition && expr)。它们不仅代码更简洁,而且意图更清晰。
// 优化前的复杂IIFE
// {(() => { ... })()}
// 优化后的三元运算符
{state.users.length > 0 ? (
// 渲染用户列表
) : (
// 渲染加载状态
)}这里我们使用 state.users.length > 0 来判断是否有数据。如果有数据,就渲染用户列表;否则,显示“Loading...”状态。
当使用 map 方法渲染列表时,为每个列表项提供一个唯一的 key 属性至关重要。key 帮助React识别列表中哪些项被更改、添加或删除。没有 key 或 key 不唯一可能导致性能问题或渲染错误。
// 错误示范:缺少key属性
// state.users.map((elem) => <User props={elem} />)
// 正确示范:添加唯一的key属性
state.users.map((elem) => <User key={elem.id} props={elem} />) // 假设elem有唯一的id通常,API返回的数据会包含一个唯一的ID,可以将其作为 key。如果没有,可以考虑使用数组索引作为 key,但这通常只在列表项的顺序和内容不会改变时才安全。
结合上述最佳实践,原始组件可以被重构为以下形式:
import React, { useState, useEffect } from 'react';
// 假设User组件如下
function User({ props }) {
// 渲染单个用户的逻辑,例如显示姓名、图片等
return (
<div style={{ border: '1px solid #ccc', margin: '10px', padding: '10px' }}>
<p>Name: {props.name.first} {props.name.last}</p>
@@##@@
</div>
);
}
export function Main() {
// 使用更清晰的state名称,例如直接存储用户数组
const [users, setUsers] = useState([]); // 初始化为空数组,而不是包含空数组的对象
useEffect(() => {
fetch(`https://randomuser.me/api/?results=20`)
.then(res => res.json())
.then(json => {
// 直接使用json.results更新state,确保不可变性
setUsers(json.results);
})
.catch(error => {
console.error("Error fetching users:", error);
// 可以在这里设置一个错误状态,以便渲染错误信息
});
}, []); // 空依赖数组表示只在组件挂载时运行一次
return (
<>
{users.length > 0 ? (
// 使用三元运算符进行条件渲染
// 为每个User组件添加唯一的key属性,这里使用user.login.uuid作为key
users.map((elem) => <User key={elem.login.uuid} props={elem} />)
) : (
<p style={{ textAlign: "center", display: "block", width: "100%" }}>Loading...</p>
)}
</>
);
}通过本教程的分析与优化,我们学习了在React中处理异步数据和条件渲染的关键要点:
遵循这些最佳实践,将有助于构建更健壮、可维护且性能优异的React应用。
以上就是React条件渲染与数据获取:State管理与渲染逻辑优化实践的详细内容,更多请关注其它相关文章!
# js
# react
# 招聘网站 互联网推广
# 山东网站建设便宜的公司
# 网络网站平台推广方案
# 律师网站建设策划内容
# 涂料线上营销推广方案
# 珠海网站关键词优化软件
# 张掖全网整合营销推广
# 武清网站优化
# seo网络推广工程
# 贵州seo服务哪个便宜
# 只在
# 但这
# 将其
# 重构
# 的是
# 检测到
# 数据结构
# 而不是
# 回调
# 运算符
# 优化实践
# 常见问题
# ai
# 回调函数
# json
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
Bootstrap 5导航栏折叠功能失效:数据属性迁移指南
Python对象引用与属性赋值:理解链表中的行为
《小宇宙》标记不友善评论方法
Teambition网盘如何共享文件
TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法
mysql怎么查询数据_mysql基础查询语句使用教程
CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程
mysql中如何配置字符集和排序规则_mysql字符集排序配置
虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画
Mac hosts文件在哪里_Mac修改hosts文件详细教程
PHP 4 函数中引用参数的默认值限制与解决方案
windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化
React应用中Commerce.js数据加载与状态管理最佳实践
百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法
中大网校app做题记录清除方法
OTT月报 | 2025年9月智能电视大数据报告
抖音官网入口快速访问 抖音网页版账号注册解析
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务
CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式
如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战
原子笔记app误删找回教程
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法
Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程
iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】
汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口
《豆瓣》私信用户方法
mysql触发器如何编写_mysql触发器编写规范与代码示例讲解
英国搜索:多数英国人认为语言搜索是未来搜索
《随手记》启用语音备注方法
盲鳗善于分泌黏液猜猜主要用来做什么
ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算
QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航
苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程
PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】
Lar*el 关联查询:同时筛选父表与子表数据的高效策略
《领英》查看屏蔽名单方法
利用Flexbox实现图片元素的二维布局:2x2网格排列指南
海棠阅读网页版_进入海棠网页版在线阅读中心
PHP多语言网站的实现:会话管理与翻译函数优化教程
《气泡星球》兑换码礼包大全
抖音视频如何添加标题?添加标题有哪些好处?
Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】
如何编写一个符合 composer 规范的 post-install-cmd 脚本?
网易云音乐闹钟铃声设置教程
圆通快递官网入口查询单号 手机版官方查询入口
《王者荣耀世界》英雄获取攻略
《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐
Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】
2025-10-03
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。