React中的HOC高阶组件处理

news2024/11/27 10:37:19

先了解函数柯里化

柯里化函数(Currying Function)是指将一个接受多个参数的函数转化成一系列只接受单个参数的函数,并且返回接受单个参数的函数,达到简化函数调用和提高可读性的目的。

简单来说,柯里化即将接收多个参数的函数转换成为接收单个参数的函数,并返回一个新的函数,新函数可以在后续的调用中继续接收参数,直到参数全部传递完成后返回最终的结果。

举个例子,对于一个加法函数 add(x, y),我们可以通过柯里化将其转换为只接收一个参数的函数 addCurry(x):

function add(x, y) {
  return x + y;
}

function addCurry(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = addCurry(5); // 创建一个新的函数 add5,等价于 add(5, y)
console.log(add5(3)); // 输出 8

在上面的例子中,我们通过柯里化将 add 函数转换为 addCurry 函数,addCurry 函数返回一个函数,这个函数只接受一个参数 y,并返回 x + y 的值。像 addCurry(5) 这样调用 addCurry 函数,会返回一个新的函数 add5,这个函数等价于调用 add(5, y)

hoc是基于柯里化吗

React 高阶组件 (Higher-Order Component,HOC) 并不是基于柯理化函数的概念设计的,但是可以结合柯理化函数来实现更强大的功能。

HOC 是一种函数,它接受一个组件并返回一个新组件。新组件有时被称为包装组件,它可以在原始组件的基础上添加一些新的逻辑或功能,从而增强原始组件的能力,实现代码的复用和可拓展性。

例如,在 React 中,我们可以编写一个 HOC 来实现计时器的功能:

function withTimer(WrappedComponent) {
  return class extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        time: new Date(),
      };
    }

    componentDidMount() {
      this.timerID = setInterval(() => this.tick(), 1000);
    }
    
    componentWillUnmount() {
      clearInterval(this.timerID);
    }
    
    tick() {
      this.setState({
        time: new Date(),
      });
    }

    render() {
      const {time} = this.state;
      return <WrappedComponent time={time} {...this.props}/>;
    }
  };
}

在上述代码中,我们编写了一个名为 withTimer 的 HOC,它接受一个组件 WrappedComponent 作为参数,并返回一个封装组件。封装组件实现了一个计时器的功能:利用 componentDidMountcomponentWillUnmount 两个生命周期函数来管理计时器的启动和停止;利用 tick 函数来更新时间状态 time

其中,使用到了 ES6 的类组件、生命周期函数、setIntervalclearInterval 方法。

我们可以将 withTimer HOC 应用到一个组件中,例如:

function Clock(props) {
  const {time} = props;
  return <div>{time.toLocaleTimeString()}</div>;
}

const EnhancedClock = withTimer(Clock); // 使用 withTimer 包裹 Clock 组件
ReactDOM.render(<EnhancedClock />, document.getElementById('root'));

在上述代码中,我们使用 withTimer HOC 包裹 Clock 组件得到一个增强的组件 EnhancedClock。这个增强的组件可以显示当前时间,并在页面上每秒钟更新。这样,我们就可以通过简单地组合组件来实现复杂的功能,达到更高的复用性和可扩展性。

可以看到,HOC 和柯理化函数类似,都是将某个函数作为参数,然后返回一个新的函数。在某种程度上,HOC 某种意义上可以看作是柯理化的变体,通过函数式编程的方式来实现高度可复用的代码。不同的是,柯理化函数主要是针对函数的参数进行处理,而 HOC 主要是针对组件进行处理。

例子

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/647047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据为什么如此重要?

简单来说&#xff0c;大数据就是结构化的传统数据再加上非结构化的新数据。那么传统数据和新数据又是什么呢&#xff1f;传统数据就是IT业务系统里面的数据&#xff0c;如客户资料、财务数据等。这些数据是结构化的&#xff0c;量也不是特别大&#xff0c;一般只是TB级。对比传…

如何让自己的代码顺利通过代码审查?

最近很多同学&#xff0c;都去暑期实习了&#xff0c;实习就意味着要在公司项目是写代码了。 大多数同学&#xff0c;可能面试能力不错&#xff0c;但是实操还是弱了一些。之前有位同学&#xff0c;春招靠面试能力去了大厂&#xff0c;然后实习刚工作的时候&#xff0c;要写代…

Java30天拿下-----第二天(运算符,标识符,Scanner,进制转换)

Java30天拿下-----第二天 一 运算符算术运算符赋值运算符关系运算符逻辑运算符三元运算符运算符的优先级 二 标识符关键字保留字 三 控制台接收键盘输入&#xff1a;Scanner四 进制进制的转换&#xff08;基本功&#xff09;其他进制转为十进制十进制转为其他进制二进制转为其他…

《当我谈跑步时,我谈些什么》痛楚难以避免,而磨难可以选择

《当我谈跑步时&#xff0c;我谈些什么》痛楚难以避免&#xff0c;而磨难可以选择 村上春树&#xff0c;日本当代小说家&#xff0c;情感类类型作家。主要作品有《且听风吟》《挪威的森林》《海边的卡夫卡》《奇鸟行状录》《1Q84》等。 施小炜 译 来自百度百科的一条&#xff1…

存储快速入门——【2】数据复制与容灾、云存储、大数据概念

存储快速入门——【2】数据复制与容灾、云存储、大数据概念 一、数据复制与容灾 1 恢复时间目标&#xff08;RTO&#xff09;和恢复点目标&#xff08;RPO&#xff09; 对于信息系统而言&#xff0c;容灾就是使信息系统具有应对一定的灾难袭击&#xff0c;保持系统或间断运行…

2023年软件测试工程师,初级到高级进阶路线指南,测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 提到软件测试工程…

一、JavaScript函数this指向

1 this的绑定规则 2 apply/call/bind 3 this绑定优先级 4 绑定之外的情况 5 箭头函数的使用 6 this面试题分 <script>// 定义函数function foo(name) {console.log("foo函数:", this)}// 1.方式一: 直接调用 这里的this指向window// foo()// 2.方式二: 通…

Java网络编程知识

目录 1.网络编程概述 1.网络编程的目的 2.网络编程的三个问题 1.如何准确定位网络上的主机&#xff1f; 2.如何定位主机上的特定应用&#xff1f; 3.找到主机后如何可靠高效的进行数据传输&#xff1f; 2.通信要素一:IP和端口号 1.IP地址 2.端口号 3.套接字 4.通信要…

基于Yolov8的纸箱破损检测系统

目录 1.Yolov8介绍 2.纸箱破损数据集介绍 2.1数据集划分 2.2 通过voc_label.py得到适合yolov8训练需要的 2.3生成内容如下 3.训练结果分析 4. 纸张破损检测系统设计 4.1 PySide6介绍 4.2 安装PySide6 4.3 纸张破损检测系统设计 1.Yolov8介绍 Ultralytics YOLOv8是Ultral…

SpringBoot动态加载jar包中的bean

一、业务场景 在有些业务场景下&#xff0c;需要SpringBoot来动态加载jar中的class文件&#xff0c;自动往spring容器中添加新的bean&#xff1b;如物联网设备上传的信息用物模型来解析&#xff0c;用java来解析物模型&#xff0c;但用户的设备千差万别&#xff0c;解析设备的…

系统移植 搭建nfs服务器,启动盘,内核安装和加载

目录 1. nfs 服务器网络环境搭建 1.1. 查看是否安装了 nfs 服务器 1.2. 修改nfs配置文件 1.3. 创建nfs工作目录 1.4. 重启nfs服务 1.5. 开始测试是否成功 2. SD 卡启动盘 2.1. 方法1&#xff1a;从0扇区开始烧写 2.2. 方法2&#xff1a;直接部署 3. Linux 内核的安装…

SpringBoot编程---Day 01

目录 一、springboot介绍 &#xff08;一&#xff09;Spring Boot 特性 &#xff08;二&#xff09;了解自动配置原理 &#xff08;三&#xff09;springboot 入口功能详解 &#xff08;四&#xff09;自定义banner &#xff08;五&#xff09;容器功能 (六)配置文件 二…

(九)枚举器和迭代器(1)

一、枚举器和可枚举类型 复习完了数组之后&#xff0c;由于数组遍历的这个行为&#xff0c;跟枚举器有很大的相关性&#xff0c;所以接下来继续要学习与枚举器相关的内容。 1、使用 foreach 语句 int[] arr1 { 10, 11, 12, 13 };foreach (int item in arr1)//枚举元素Consol…

尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

【JVM 监控工具】性能诊断--JProfiler的使用

文章目录 背景一、Java 性能诊断工具简介二、简单命令行工具三、图形化综合诊断工具JVisualvmJProfiler 四、分布式应用性能诊断五、IDEA中设置JProfilerJProfiler是什么功能安装使用生成快照配置VM运行程序 背景 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&a…

公司新来的阿里p8,看了我做的APP和接口测试,甩给了我这份文档

移动应用App已经渗透到每个人的生活、娱乐、学习、工作当中&#xff0c;令人激动、兴奋且具有创造性的各种App犹如雨后春笋般交付到用户手中。各类智能终端也在快速发布&#xff0c;而开发者对于全球移动设备的质量和性能却掌握甚少&#xff0c;App与设备的兼容性问题常常导致用…

【状态估计】基于卡尔曼滤波器的传感器直流电机驱动研究(Matlab代码、Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Navicat 受邀出席 PostgreSQL 技术峰会,欢迎莅临我们的展台了解 Navicat 工具包如何提升你的工作效能

Navicat 受邀出席 PostgreSQL 技术峰会成都站&#xff0c;欢迎童鞋们莅临我们的展台。你有机会与我们的专家面对面交流&#xff0c;并了解实用的 Navicat 工具包如何帮助PostgreSQL用户&#xff08;应用开发人员、DBA、运维人员以及数据分析师&#xff09;有效地提升日常的工作…

串口控制小车(二次开发)

0.资料 项目工程文件夹 分文件原理 之前的代码 1.L9110S电机驱动模块demo 2.串口通信&#xff08;习题4&#xff1a;PC发送字符串指令给单片机&#xff09; 3.wifi模块&#xff08;串口中断代码优化&#xff09; 3.蓝牙模块 1.串口指令控制小车_分文件 1、和单片机的接…

MVC、MVP、MVVM:详解2

概述 MVC、MVP、MVVM 都是在 Android 开发中经常用到的架构思想&#xff0c;它们都是为了更好地分离代码、提高代码可复用性、方便维护等目的而设计的。下面对这三种架构思想进行简单的介绍和比较。 MVC MVC 架构是最早被使用的一种架构&#xff0c;它把程序分成了三个部分&…