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

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

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

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

最初的恐怖

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

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

分解它

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

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

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

渲染 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 

Loading...

;}function renderError(error) { return

Error: {error.message}

;}function renderData(data) { return
{/* Complex UI logic here */}
;}//After that, component is ni much pretty shapefunction 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)使代码更加模块化、可重用和可测试。

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

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

以上就是驯服野兽:我如何重构凌乱的 React 组件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1490577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
LeetCode 冥想:硬币找零
上一篇 2025年12月19日 13:17:01
TAWKTO 和 NEXTjs 集成
下一篇 2025年12月19日 13:17:14

相关推荐

  • Element UI 表格固定列与常规列 Hover 事件为何不同步?

    element ui 中 el-table 固定列与常规列 hover 事件的不同步问题 element ui 提供的 el-table 组件在存在固定列时,固定列与常规列的 hover 触发事件存在不同步的问题。具体表现为: 当鼠标快速悬浮在常规列上时,固定列的 hover 事件较慢地触发。当鼠标…

    2025年12月19日
    100
  • 深入探讨 JavaScript 的原型链和函数的基础作用

    javasc++ript 采用独特的继承方法,与 java 或 c++ 等传统的面向对象语言不同。 javascript 使用基于原型的继承模型,而不是依赖基于类的继承。该模型以语言的函数及其原型属性为基础,构成了对象如何继承行为的基础。为了理解为什么 javascript 的继承是这样设计的,以及…

    2025年12月19日
    000
  • 如何在 GDevelop 中制作基本平台游戏 初学者分步教程

    完整演示链接零编码的基本平台游戏以下是在 GDevelop 5 中使用玩家和地面对象创建基本平台游戏项目的快速指南: 第 1 步:创建一个新项目 打开GDevelop 5。点击创建一个新项目。选择空项目或选择平台示例来抢占先机。使用名称保存项目(例如“MyPlatformer”)。 第 2 步:添加…

    2025年12月19日
    100
  • 如何在 React Native Row 组件中实现 flex-baseline 样式?

    flex-baseline 样式在 react native row 组件中实现 在 react native 中,row 组件类似于 html 中的 flexbox 布局,允许在水平方向排列子元素。如果你想在 row 组件中实现类似 html 中 flex-baseline 的样式,可以采用以下方…

    2025年12月19日
    000
  • MongoDB 服务器综合指南:现代应用程序的数据库

    MongoDB 是一种流行的 NoSQL 数据库,以其处理大规模数据的灵活性、可扩展性和性能而闻名。作为面向文档的数据库,MongoDB 将数据存储在灵活的、类似 JSON 的文档中,非常适合需要管理不同数据类型和结构的应用程序。 MongoDB 服务器广泛应用于各个行业,为从内容管理系统到实时分析…

    2025年12月19日
    000
  • 了解 HTTP 内部服务器错误:原因、解决方案和预防

    HTTP 500 内部服务器错误是访问网站时遇到的常见但令人沮丧的错误。此错误是服务器端问题,这意味着它是由托管网站的 Web 服务器而不是客户端浏览器内的问题引起的。当用户遇到 500 错误时,他们通常会看到一条通用消息,指出“出了问题”,但没有提供具体详细信息。本文将深入探讨 https://k…

    2025年12月19日
    100
  • QA 自动化综合指南:简化质量保证,实现更快、更可靠的软件发布

    质量保证 (QA) 自动化已成为软件开发生命周期中的关键组成部分,使团队能够以更快的速度交付高质量的应用程序。随着软件复杂性的不断增加以及对更短发布周期的需求,手动测试往往无法满足要求。 QA 自动化通过自动化重复测试任务、提高准确性和缩短上市时间来帮助克服这些限制。本文将探讨 QA 自动化的基础知…

    2025年12月19日
    000
  • 按需引入Vant:为什么JS表达式组件没有样式,标签组件却有?

    按需引入vant:标签组件有样式,js表达式组件无样式 在使用按需引入vant框架时,遇到了这样的问题:js表达式组件没有样式,而标签组件有样式。 问题分析 引起此问题的原因,是因为在按需引入时,js表达式组件的样式文件没有正确引入。这有两个原因: 未使用unplugin-auto-import插件…

    2025年12月19日
    000
  • Element-UI Cascader 多选省市区如何优化回显?

    element-ui cascader 组件省市区多选优化 对于省市区多选需求,Element-UI Cascader 组件提供了多选功能。然而,直接返回完整的树形结构可能会导致页面渲染卡顿,而通过懒加载回显也存在潜在的性能问题。以下是优化该需求的几种方式: 一种方法是后端直接返回完整的树形结构,但…

    2025年12月19日
    000
  • Element-UI Cascader实现省市区多选如何优化性能?

    Element-UI Cascader实现省市区多选的优化策略 在使用Element-UI Cascader组件实现省市区多选时,后端返回完整的树形结构可能会导致页面渲染卡顿。对于处理这种场景,我们可以采用以下优化策略: 优化数据渲染策略 虽然后端返回了完整的树形结构数据,但我们并不需要一次性渲染全…

    2025年12月19日
    000
  • Vite 按需引入 Vant 时,表达式组件为何无法加载样式?

    处理 vite 中按需引入 vant 时表达式组件无样式的问题 当在 vite 框架中按需引入 vant ui 时,部分以 javascript 表达式形式引用的组件可能无法正确加载样式,而标签形式引用的组件则正常。这通常与插件配置和组件类型有关。 解决方法 有两种解决方法: 方法 1:使用 unp…

    2025年12月19日
    000
  • 按需引入Vant框架后,JS表达式组件为什么没有样式?

    按需引入vant框架,js表达式组件却没有样式? 当你按需引入vant框架时,会遇到这样的问题:在模板中使用标签组件时样式正常,但使用js表达式组件时却没有样式。这是为什么呢? 这个问题的原因在于:在按需引入时,只有在模板中使用标签组件才会自动导入样式。而js表达式组件需要手动导入样式。 解决方法:…

    2025年12月19日
    000
  • JavaScript 异步函数中如何处理带条件的数据校验?

    如何处理带条件的 javascript 异步函数中下一步执行? 在处理异步 javascript 函数时,遇到返回数据结构不满足条件需要阻止下一步执行的情况时,通常可以通过以下方式解决: 在你的代码示例中,你将条件判断放置在 if 语句中,但是浏览器仍报错,这可能是浏览器缓存问题导致的。 要防止下一…

    2025年12月19日
    000
  • 纯前端生成的 Blob 流,如何下载并打开?

    如何下载纯前端生成的 blob 流? 在前端生成 blob 流但没有 url 时,在 h5 环境和小程序中将其下载到手机并打开可能会遇到一些挑战。 方法: 将 blob 流转换为 base64 编码字符串 立即学习“前端免费学习笔记(深入)”; let reader = new filereader…

    2025年12月19日
    000
  • 微信扫码授权后如何关闭弹窗并刷新父窗口?

    微信扫码授权后如何关闭弹窗并刷新父窗口? 在微信扫码授权登录时,可能会遇到弹出小窗口登录的情况。登录完成后,需要关闭此弹窗并刷新大窗口以更新会话信息。 要解决这个问题,可以使用以下步骤: 确保扫描授权后不直接跳转到目标页面,而是跳转到一个中间页面。在中间页面中,通过 window.opener 对象…

    2025年12月19日
    300
  • VUE 开发中遇到第三方包没有 TS 版本怎么办?

    vue 开发中第三方包缺乏 ts 版本的解决之道 在 vue 开发过程中,使用 ts 进行类型检查时,可能会遇到某些第三方 npm 包仅提供 js 版本的情况。在这种情况下,如何解决这个问题呢? 如问题所述,对于没有 ts 版本的包,我们可以通过以下方法进行处理: 定义 ts 类型:手动创建 ts …

    2025年12月19日
    000
  • 如何实现动态添加时间范围并禁用冲突时段?

    动态添加时间范围的逻辑实现 需求: 开始时段选择后,结束时段小于开始时段的值置灰不能选择。新增时间段时,已选时间段置灰不能选择。 逻辑实现: 父组件(VueTemplateIndex): 初始化时,将数据进行行列合并操作。新增数据时,使用 deepClone 深拷贝当前数据,并在子组件中编辑。 子组…

    2025年12月19日
    000
  • 如何免费在线将 JSON 转换为图表

    json 是一种广泛使用的数据交换格式,尤其是在 web 开发和 api 中。然而,一眼理解复杂的 json 结构可能具有挑战性。将 json 数据可视化为图表可以使其更易于理解和使用,特别是对于开发人员、数据分析师和项目经理而言。 在这篇博客中,我将向您介绍 jsonviewer.tools,这是…

    2025年12月19日
    100
  • 动态添加时间范围,如何实现已选时间置灰?

    动态添加时间范围,如何置灰已选择时间? 问题: 需要动态添加时间范围,要求满足以下条件: 开始时段小于结束时段。后续添加的时间范围内,前面已选择的时间置灰不可选。删除某行已选的时间后,该时间范围重新置为可选。 解决方案: 方案基于 vue.js 框架实现,包括父组件和子组件: 父组件 负责管理表格和…

    2025年12月19日
    000
  • Element UI Row组件中如何实现类似flex-baseline的样式?

    row组件中实现类似html flex-baseline的样式 在element ui的row组件中,想要实现类似html flex-baseline的样式,我们需要用到组件的alignitems属性。 element ui的row组件默认将子元素垂直居中对齐。要实现类似flex-baseline的…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信