讲师中心 微信公众号
AI工具推荐 视频效率加速

驯服野兽:我如何重构凌乱的 React 组件

星涛姑娘_9349

星涛姑娘_9349

发布时间:2024-08-19 09:03:51

|

618人浏览过

|

来源于dev.to

转载

驯服野兽:我如何重构凌乱的 react 组件

我们都去过那里。你打开几个月前编写的 react 组件,感觉就像你正在看一个匆忙的人编写的代码 - 因为你可能很匆忙。截止日期迫在眉睫,功能需要交付。快进到今天,是时候重构那个混乱的组件了。

所以,这就是我解决这个问题的方法。

最初的恐怖

我注意到的第一件事是该组件变得太大了。它尝试做所有事情,比如处理状态、进行 api 调用、管理复杂的 ui 逻辑,甚至直接应用样式。这是一个超过 540 行的文件,读完它就像在没有地图的丛林中漫步一样。

第一步是接受现实:这段代码不再可维护。如果我(写这篇文章的人)几乎无法理解正在发生的事情,那么其他人就没有机会。所以,我决定把它分解。

分解它

我首先确定组件的不同职责。共有三个明确的区域:

  1. 状态管理:处理组件的状态与 ui 逻辑交织在一起。

  2. api 调用:获取数据并处理加载状态。

  3. 渲染 ui:以稍微复杂的 ui 结构显示数据。
    这些职责中的每一个都需要分开。

提取状态和 api 逻辑的钩子

我做的第一件事是将状态管理和 api 逻辑提取到自定义钩子中。这不仅清理了组件,还使得在其他地方测试和重用逻辑变得更容易。

这里提到一些代码(不是原来的代码):

function usedatafetching(apiendpoint) {
  const [data, setdata] = usestate(null);
  const [loading, setloading] = usestate(true);
  const [error, seterror] = usestate(null);

  useeffect(() => {
    async function fetchdata() {
      try {
        let response = await fetch(apiendpoint);
        let result = await response.json();
        setdata(result);
      } catch (err) {
        seterror(err);
      } finally {
        setloading(false);
      }
    }

    fetchdata();
  }, [apiendpoint]);

  return { data, loading, error };
}

通过 usedatafetching,我提取了 api 调用逻辑并处理了加载和错误状态。现在,组件只需要调用这个钩子并获取必要的数据,干净简单。

简化 ui 逻辑
接下来,我查看了渲染逻辑。以前,我在渲染函数中检查加载、错误和数据,这使得它很难理解。我把这个逻辑分成小的、独立的函数,就像这样(当然不是原来的;)

function renderLoading() {
  return <p>Loading...</p>;
}

function renderError(error) {
  return <p>Error: {error.message}</p>;
}

function renderData(data) {
  return <div>{/* Complex UI logic here */}</div>;
}
//After that, component is ni much pretty shape

function MyComponent() {
  const { data, loading, error } = useDataFetching('/api/data-endpoint');

  if (loading) return renderLoading();
  if (error) return renderError(error);
  if (data) return renderData(data);

  return null;
}

最后的谈话

分解组件后,文件从 540 多行减少到大约 124124 行,逻辑也更容易理解。该组件现在只做一件事:渲染 ui。其他所有内容都已卸载到自定义挂钩和实用函数。

这次经历让我学到了一些重要的教训:

  • 不要害怕重构:很容易将混乱的代码保留原样,尤其是当它有效时。但花时间清理它会让您的生活以及未来的自己的生活变得更加轻松。

  • 关注点分离:将不同的关注点保留在不同的地方(状态、api、ui)使代码更加模块化、可重用和可测试。

  • 保持简单:通过将逻辑卸载到更小的函数来简化渲染函数,使组件更具可读性。

所以,如果你有一个像你一样乱七八糟的组件,请毫不犹豫地重构。这不仅仅是关于干净的代码,而是让您作为开发人员的生活更轻松。谁不想要这样?

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

60

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

40

2026.10.22

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

280

2026.10.22

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn