这就是所有优秀 React 开发人员构建其状态的方式

组件状态管理不当会导致各种问题,最主要的是容易出错、产生bug以及配置错误。而良好的状态结构则能构建出易于维护、调试和修改的组件。本文将探讨如何确保组件拥有正确组织的状态结构。

状态结构化基础

React组件通常会用到状态,状态变量的数量取决于组件的设计。即使状态结构不佳,组件也能运行,但我们可以做得更好。以下几点是构建组件状态结构的指导原则:

1. 合并关联状态

如果多个状态值经常同时变化,则应考虑将它们合并。虽然分开管理状态也可以,但合并关联状态能显著降低状态同步出错的概率。例如,处理宽高比:

// 不佳
const [height, setHeight] = useState(500);
const [width, setWidth] = useState(500);

// 较佳
const [aspectRatio, setAspectRatio] = useState({ width: 500, height: 500 });

注意:合并状态到对象后,更新时必须使用展开运算符避免丢失其他属性:

// 错误
setAspectRatio({ width: 750 }); // height 属性丢失

// 正确
setAspectRatio({ ...aspectRatio, width: 750 });

2. 避免状态冲突

例如,提交按钮的状态:加载中、错误和已完成。如果分别使用三个状态变量,容易出现状态不一致的情况(例如同时处于加载中和已完成状态)。更好的方法是使用常量和单个状态变量:

export function ApiResult() {
  const state = {
    loading: 'loading',
    error: 'error',
    resolved: 'resolved',
  };
  const [requestState, setRequestState] = useState(state.resolved);

  async function onSubmitClick(event) {
    event.preventDefault();
    setRequestState(state.loading);
    await requestToServer(text);
    setRequestState(state.resolved);
  }
  // ...
}

这种方法确保状态一致性,并避免拼写错误。

3. 避免不必要的状态

在创建状态之前,确保其值无法从props、现有状态或状态值的组合中推导出来。如果可以推导,则应避免将其作为组件状态。

// 不佳
export function Tracker() {
  const [x, setX] = useState(0);
  const [y, setY] = useState(0);
  const [position, setPosition] = useState({ x: 0, y: 0 });
  // ...
}

position 可以由 x 和 y 计算得出,无需单独作为状态存在。

4. 避免状态重复

状态重复会使保持同步变得困难。如果发现使用多个状态来保存相同的数据,应寻找解决方案,例如将状态提升到父组件。

5. 最小化状态嵌套

过度嵌套的状态会使更新变得复杂。解决方案是“扁平化”或“标准化”状态。例如,使用父状态保存子状态ID数组,并创建子状态ID到父状态的映射。 状态嵌套的深度取决于具体情况,但扁平化状态通常能简化更新并避免重复。

注意:可以使用immer库来简化不可变状态的嵌套更新。

如有任何疑问,请随时提出。

以上就是这就是所有优秀 React 开发人员构建其状态的方式的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

超自动化安全:构建智能安全运营的神经系统

在网络安全威胁日趋复杂、攻击手法持续迭代的当下,传统安全运营方式正遭遇前所未有的压力——告警泛滥、响应迟缓、人力紧缺、经验断层……安全团队每日深陷于海量告警洪流之中,真正高危的威胁反而被淹没在噪声之下;攻击扩散节奏已从“小时级”压缩至“秒级”,而人工研判与处置仍停留在“小时”甚至“天”的维度。这种疲于应付的被动防御困局,正是安全运营所经历的“至暗时刻”。 ☞☞☞AI 智能聊天, 问答助手, AI ...
· AI · 154905

Asana宣布以7500万美元收购无代码AI智能代理构建器StackAI

**5月28日快讯**,全球协同办公领军企业 Asana 于周四下午,在公布最新财报及召开投资者电话会议期间,正式对外披露以7500万美元收购人工智能工作流自动化新锐企业 StackAI。此次并购被明确列为 Asana 全面转型为 AI 原生办公平台战略的关键落子,目标是将自身升级为“人机协同团队的统一操作系统”。交易完成后,StackAI 联合创始人 Tony Rosinol 与 Bernard...
· AI · 131160

Jenkins怎么配置自动构建任务 Jenkins流水线设置方法【技巧】

要实现Jenkins自动构建需完成三步:安装Pipeline、Git、JUnit及对应平台插件并重启;创建流水线任务并配置含拉取、测试、报告三阶段的脚本;配置Git webhook触发,确保Jenkins地址可被Git平台访问。 要让Jenkins在代码提交后自动拉取、编译、测试并报告结果,必须完成三件事:装对插件、写对流水线脚本、连通Git与Jenkins的触发链路。缺一不可,否则构建永远卡在“...

我宣布,这就是现在人声最真实的AI音乐模型!

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 让你的AI更聪明!这 6 个心法比套用模板好用 10 倍! 已经 2026 年了,其实还是看到很多朋友,说不知道怎么能更好的跟 AI 对话。 而我呢,自从两个月前发了b站鬼畜文艺复兴的那篇文章之后,也已经有一阵子没做过音乐了,正好想做点好玩的。 正好,也借着这个机会,就试了一下MiniMax的M...
· AI · 69153

DeepSeek与FastAPI构建后端AI服务的教程

最稳妥路径是用Ollama或官方API代理而非FastAPI直载模型,因后者易显存溢出、启动卡死、首次请求延迟高;Ollama适合本地开发,官方API适合生产,长上下文需加max_tokens限制。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 直接用 FastAPI 封装 DeepSeek 模型提供 API 服务,最稳妥的路径不是自己加载...
· AI · 47539

如何用CrewAI和DeepSeek构建自动化工作团队

CrewAI+DeepSeek组合的关键在于角色分工、任务可交付与流程匹配:Agent需明确定义技能边界和工具约束,Task须指定具体expected_output格式,Crew的Process应据任务复杂度选sequential或hierarchical。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 直接上结论:CrewAI + Dee...

Trae的AI能不能帮我分析Webpack或Vite的构建配置并给出优化Bundle大小的建议?

Trae AI需用户主动提供配置或stats.json等文本内容,才能分析Webpack/Vite构建并给出缩小Bundle体积的具体建议,其本身不自动读取项目文件。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您在使用 Trae AI 插件时希望其分析 Webpack 或 Vite 的构建配置文件并提供缩小 Bundle 体积的具体...
· AI · 94028