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

React 高阶组件的优缺点

React 高阶组件的优缺点

优点

1. 代码复用性高
  • 公共逻辑封装:当多个组件需要实现相同的功能或逻辑时,高阶组件可以将这些逻辑封装起来,避免代码重复。例如,多个组件都需要在挂载时进行数据获取操作,就可以创建一个数据获取的高阶组件,将数据获取逻辑集中处理。
const withDataFetching = (WrappedComponent, apiUrl) => {return class extends React.Component {constructor(props) {super(props);this.state = {data: null,loading: true,error: null};}componentDidMount() {fetch(apiUrl).then(response => response.json()).then(data => this.setState({ data, loading: false })).catch(error => this.setState({ error, loading: false }));}render() {const { data, loading, error } = this.state;if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error.message}</div>;return <WrappedComponent data={data} {...this.props} />;}};
};

这个高阶组件可以应用到多个需要数据获取的组件上,提高了代码的复用性。

2. 增强组件功能
  • 扩展组件能力:高阶组件可以为组件添加额外的功能,而不需要修改原始组件的代码。例如,添加日志记录、性能监控等功能。
const withLogging = (WrappedComponent) => {return class extends React.Component {componentDidMount() {console.log(`Component ${WrappedComponent.name} has mounted.`);}render() {return <WrappedComponent {...this.props} />;}};
};

通过这个高阶组件,可以为任意组件添加挂载日志记录功能。

3. 分离关注点
  • 职责清晰:高阶组件可以将不同的关注点分离,使得每个组件的职责更加单一。例如,将状态管理、数据获取等逻辑与视图渲染逻辑分离。以表单组件为例,使用高阶组件管理表单状态,让表单组件专注于视图渲染。
const withFormState = (WrappedComponent) => {return class extends React.Component {constructor(props) {super(props);this.state = {formData: {}};this.handleChange = this.handleChange.bind(this);}handleChange(event) {const { name, value } = event.target;this.setState((prevState) => ({formData: {...prevState.formData,[name]: value}}));}render() {return (<WrappedComponentformData={this.state.formData}handleChange={this.handleChange}{...this.props}/>);}};
};
4. 便于测试
  • 独立测试:由于高阶组件将逻辑封装在一个独立的函数中,使得逻辑部分可以单独进行测试,提高了代码的可测试性。可以对高阶组件的逻辑进行单元测试,确保其功能的正确性。
5. 支持代码分割和懒加载
  • 性能优化:高阶组件可以结合 React.lazySuspense 实现组件的懒加载,从而优化应用的性能,减少初始加载时间。
const lazyLoadComponent = (importComponent) => {const LazyComponent = React.lazy(importComponent);return (props) => (<React.Suspense fallback={<div>Loading...</div>}><LazyComponent {...props} /></React.Suspense>);
};

缺点

1. 增加代码复杂度
  • 理解成本高:高阶组件嵌套过多会使代码的结构变得复杂,增加开发者理解和维护代码的难度。尤其是当多个高阶组件嵌套在一起时,很难直观地看出每个组件的具体功能和数据流向。
const Component = withLogging(withDataFetching(withFormState(BaseComponent)));

在这个例子中,BaseComponent 被多个高阶组件层层包裹,代码的可读性会受到影响。

2. 命名冲突
  • 属性和方法冲突:如果多个高阶组件为组件添加了相同名称的属性或方法,可能会导致命名冲突。例如,两个高阶组件都为组件添加了 handleClick 方法,就会出现冲突,影响组件的正常运行。
3. 静态方法丢失
  • 手动处理:高阶组件返回的新组件不会自动继承原始组件的静态方法和属性,需要手动复制这些静态方法和属性,否则在使用新组件时可能会遇到问题。
function withStaticMethods(WrappedComponent) {class HOC extends React.Component {render() {return <WrappedComponent {...this.props} />;}}Object.keys(WrappedComponent).forEach((key) => {HOC[key] = WrappedComponent[key];});return HOC;
}
4. 调试困难
  • 追踪问题复杂:当出现问题时,由于高阶组件对组件进行了包装,调试过程会变得更加复杂。很难直接定位到问题所在的具体组件和代码位置。例如,在高阶组件中发生了错误,错误信息可能会被高阶组件的包装所掩盖,不易排查。

相关文章:

React 高阶组件的优缺点

React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装&#xff1a;当多个组件需要实现相同的功能或逻辑时&#xff0c;高阶组件可以将这些逻辑封装起来&#xff0c;避免代码重复。例如&#xff0c;多个组件都需要在挂载时进行数据获取操作&#xff0c;就可以创建一个数…...

(五)趣学设计模式 之 建造者模式!

目录 一、 啥是建造者模式&#xff1f;二、 为什么要用建造者模式&#xff1f;三、 建造者模式怎么实现&#xff1f;四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方…...

香橙派/树莓派 利用Wiring库 使用GPIO模拟PWM

香橙派或者树莓派 等开发板&#xff0c;本身带有硬件PWM,比如香橙派3 lts版&#xff0c;但是这个引脚不符合我的项目需求&#xff0c;我需要外接一个电机&#xff0c;在检测到人脸的时候 转动&#xff0c;但是这个硬件引脚&#xff0c;只要上电就开始输出pwm 信号&#xff0c;导…...

全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践

#作者&#xff1a;任少近 文章目录 说明&#xff1a;一 Redis的适配exporter版1.1 Redis的exporter源码版本1.2 Redis的exporter的releases版1.3 Redis_exporter版本选择理由1.4 Redis_exporter docer镜像 二 Zookeeper的适配exporter版2.1 Zookeeper的exporter源码版本2.2 Zo…...

机器学习数学通关指南——链式法则

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...

JavaScript函数-arguments的使用

在JavaScript编程语言中&#xff0c;函数是构建复杂逻辑和实现代码复用的关键组件。虽然现代JavaScript&#xff08;尤其是ES6及之后版本&#xff09;提供了更多灵活的方式来处理函数参数&#xff08;如剩余参数、默认参数等&#xff09;&#xff0c;但arguments对象仍然是一个…...

千峰React:函数组件使用(2)

前面写了三千字没保存&#xff0c;恨&#xff01; 批量渲染 function App() {const list [{id:0,text:aaaa},{id:1,text:bbbb},{id:2,text:cccc}]// for (let i 0; i < list.length; i) {// list[i] <li>{list[i]}</li>// }return (<div><…...

DPVS-3: 双臂负载均衡测试

测试拓扑 双臂模式&#xff0c; 使用两个网卡&#xff0c;一个对外&#xff0c;一个对内。 Client host是物理机&#xff0c; RS host都是虚拟机。 LB host是物理机&#xff0c;两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件&#xff0c;其中…...

2016年下半年试题二:论软件设计模式及其应用

论文库链接&#xff1a;系统架构设计师论文 论文题目 软件设计模式(Software DesignPatter)是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了重用代码以提高编码效率增加代码的可理解性、保证代码的可靠性。软件设计模式是软件开发中的…...

深入理解 SQL 中的 DATEDIFF 函数

深入理解 SQL 中的 DATEDIFF 函数 DATEDIFF 函数在 SQL 中是一个用于计算两个日期之间差值的重要工具。不同数据库实现了不同版本的 DATEDIFF&#xff0c;它们在功能和语法上有所不同。本文将详细解析 DATEDIFF 的用法、数据库间差异、复杂场景中的应用&#xff0c;以及替代方…...

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关&#xff0c;但在应用…...

【学习资料】嵌入式人工智能Embedded AI

图片来源&#xff1a; Embedded Artificial Intelligence for Business Purposes | DAC.digital 随着AI在设备端的应用&#xff0c;我们看到越来越多的可穿戴设备出现以及自动驾驶汽车的发展&#xff0c;可以看到嵌入式人工智能是新的发展方向。我为大家介绍嵌入式人工智能的…...

【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

C++ 继承,多态

看前须知&#xff1a; 本篇博客是作者听课时的笔记&#xff0c;不喜勿喷&#xff0c;若有疑问可以评论区一起讨论。 继承 定义&#xff1a; 继承机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有 类特性的基础上进⾏扩展&#xff0c;增…...

Java中的Stream API:从入门到实战

引言 在现代Java开发中&#xff0c;Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读&#xff0c;还能通过并行处理提升性能。本文将带你从基础概念入手&#xff0c;逐步深入Stream API的使用&#xff0c;并通过实战案例展示其强大功能。 1. 什么是Stream API…...

QPainter绘制3D 饼状图

先展示图片 核心代码如下&#xff1a; pie.h #ifndef Q3DPIE_H #define Q3DPIE_H#include <QtGui/QPen> #include <QtGui/QBrush>class Pie { public:double value; QBrush brush; QString description; double percentValue;QString p…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)

1.问题描述&#xff1a; 客户端创建实况窗后&#xff0c;通过Push kit更新实况窗内容&#xff0c;这个过程是自动更新的还是客户端解析push消息数据后填充数据更新&#xff1f;客户端除了接入Push kit和创建实况窗还需要做什么工作&#xff1f; 解决方案&#xff1a; 通过Pu…...

数据治理与管理

引入 上一篇我们聊了数仓架构设计,它是企业构建数据中台的基石。其本质就是构建一个可靠易用的架构,可以借此将原始数据汇聚、处理,最终转换成可消费使用的数据资源。 在拥有数据资源以后,我们就需要考虑如何利用它,为企业创造价值,让它变成企业的资产而不是负担。也就…...

什么是HTTP/2协议?NGINX如何支持HTTP/2并提升网站性能?

HTTP/2是一种用于在Web浏览器和服务器之间进行通信的协议&#xff0c;旨在提高网站性能和加载速度。它是HTTP/1.1的继任者&#xff0c;引入了许多优化和改进&#xff0c;以适应现代Web应用的需求。HTTP/2的主要目标是减少延迟、提高效率&#xff0c;以及更好地支持并发请求。 …...

安全运维,等保测试常见解决问题。

1. 未配置口令复杂度策略。 # 配置密码安全策略 # vi /etc/pam.d/system-auth # local_users_only 只允许本机用户。 # retry 3 最多重复尝试3次。 # minlen12 最小长度为12个字符。 # dcredit-1 至少需要1个数字字符。 # ucredit-1 至少需要1个大…...

LSLib终极指南:掌握《神界原罪》与《博德之门3》MOD制作的核心工具

LSLib终极指南&#xff1a;掌握《神界原罪》与《博德之门3》MOD制作的核心工具 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib LSLib是一个专门为《神界原罪》系列…...

Qwen3.5-9B-GGUF开源大模型部署:Apache 2.0协议下商用微调全流程解析

Qwen3.5-9B-GGUF开源大模型部署&#xff1a;Apache 2.0协议下商用微调全流程解析 1. 项目概述 Qwen3.5-9B-GGUF是基于阿里云通义千问3.5系列的开源大语言模型&#xff0c;经过GGUF格式量化后&#xff0c;可以在消费级硬件上高效运行。这个90亿参数的稠密模型采用了创新的Gate…...

前端新人必看:用nvm管理Node版本,再也不怕‘npm install’报错了(保姆级避坑指南)

前端新人必看&#xff1a;用nvm管理Node版本&#xff0c;再也不怕‘npm install’报错了&#xff08;保姆级避坑指南&#xff09; 刚入门前端开发时&#xff0c;最让人头疼的莫过于各种环境配置问题。尤其是当你兴致勃勃地准备运行一个Vue或React项目时&#xff0c;突然蹦出一堆…...

STM32H7的MPU与Cache配置避坑实录:解决LWIP+SAI+DMA下的HardFault与数据一致性问题

STM32H7多总线架构下的MPU与Cache配置实战指南&#xff1a;LWIPSAIDMA系统稳定性优化 在STM32H7系列高性能MCU的开发中&#xff0c;多总线架构和Cache机制为系统设计带来了前所未有的灵活性&#xff0c;同时也引入了复杂的内存管理挑战。本文将深入剖析STM32H7的内存子系统特性…...

nli-MiniLM2-L6-H768完整指南:模型量化(INT8)部署与CPU-only环境兼容方案

nli-MiniLM2-L6-H768完整指南&#xff1a;模型量化&#xff08;INT8&#xff09;部署与CPU-only环境兼容方案 1. 项目概述 nli-MiniLM2-L6-H768是一个专注于自然语言推理(NLI)任务的轻量级模型&#xff0c;能够高效判断两个句子之间的逻辑关系。该模型特别适合部署在资源受限…...

别再只用PC调试了!手把手教你用Chrome DevTools远程调试移动端H5的NFC功能

移动端H5 NFC开发实战&#xff1a;用Chrome DevTools突破调试瓶颈 每次修改完NFC相关代码都要反复打包、安装、测试&#xff0c;看着手机屏幕上的console.log一闪而过却抓不到详细日志&#xff1f;作为前端开发者&#xff0c;我们习惯了Chrome DevTools的强大调试能力&#xff…...

nli-MiniLM2-L6-H768效果实测:对比BERT-base在矛盾检测任务中的提升

nli-MiniLM2-L6-H768效果实测&#xff1a;对比BERT-base在矛盾检测任务中的提升 1. 引言 自然语言推理(NLI)是理解文本语义关系的重要任务&#xff0c;在智能客服、内容审核、知识图谱构建等领域有广泛应用。传统BERT模型虽然效果不错&#xff0c;但参数量大、推理速度慢。nl…...

3分钟找回丢失的Windows快捷键:Hotkey Detective终极使用指南

3分钟找回丢失的Windows快捷键&#xff1a;Hotkey Detective终极使用指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你…...

如何免费下载Steam创意工坊模组:WorkshopDL完整使用指南

如何免费下载Steam创意工坊模组&#xff1a;WorkshopDL完整使用指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在Epic Games Store或GOG等平台购买了游戏&#xff0…...

用Python玩转奥比中光Gemini Pro:从开箱到实时获取深度图与彩色图的保姆级教程

用Python玩转奥比中光Gemini Pro&#xff1a;从开箱到实时获取深度图与彩色图的保姆级教程 刚拿到奥比中光Gemini Pro相机的开发者们&#xff0c;是否迫不及待想看到它强大的深度视觉能力&#xff1f;本文将带你从零开始&#xff0c;一步步完成环境搭建、设备连接、代码调试&am…...