React 高阶组件(HOC)

1.React 高阶组件(HOC)


****1. HOC(高阶组件)HOC (Higher - Order Component)

定义: 高阶组件是一个接收组件作为参数并返回新组件的函数,用于复用组件逻辑,遵循纯函数特性(无副作用,输出仅依赖输入)。

****优点

  • ****逻辑复用:抽离通用逻辑(如权限校验、数据请求)。
  • ****解耦性:业务组件与公共逻辑分离,提升可维护性。
  • ****组合性:可嵌套使用多个 HOC。

****示例

const withLogger = (WrappedComponent) => {return (props) => {console.log("Rendered:", WrappedComponent.name);return <WrappedComponent {...props} />;};
};

React JSX


****2. 属性代理(Props Proxy)

通过包裹组件并操作其 props`/state` 实现功能增强,不直接修改原组件。

****应用场景

  1. ****Props 增强:添加/修改 ```props`

    const withUser = (WrappedComponent) => {return (props) => (<WrappedComponent {...props} user={currentUser} />);
    };
    

    Plain Text

  1. ****State 管理:封装状态逻辑

    const withToggle = (WrappedComponent) => {return class extends React.Component {state = { isOn: false };toggle = () => this.setState(prev => ({ isOn: !prev.isOn }));render() {return <WrappedComponent {...this.props} isOn={this.state.isOn} toggle={this.toggle} />;}};
    };
    

    Plain Text

  1. ****条件渲染:控制组件渲染逻辑

    const withLoading = (WrappedComponent) => {return (props) => (props.isLoading ? <Spinner /> : <WrappedComponent {...props} />);
    };
    

    Plain Text

  1. ****外部逻辑封装:如事件监听

    const withResize = (WrappedComponent) => {return class extends React.Component {handleResize = () => {/* 处理逻辑 */};componentDidMount() { window.addEventListener('resize', this.handleResize); }componentWillUnmount() { window.removeEventListener('resize', this.handleResize); }render() { return <WrappedComponent {...this.props} />; }};
    };
    

    Plain Text


****3. 反向继承(Inheritance Inversion,类组件专用)

通过继承被包裹组件,直接操作其生命周期和渲染树,实现更底层控制。

****核心能力

  • 拦截生命周期方法(如 ```componentDidMount`)。
  • 修改 state` 或 props`。
  • 操作渲染结果(通过 ```super.render()` 获取 React 元素并修改)。

****示例

  1. ****生命周期拦截

    const withTiming = (WrappedComponent) => {return class extends WrappedComponent {componentDidMount() {console.time("renderTime");super.componentDidMount?.();console.timeEnd("renderTime");}render() { return super.render(); }};
    };
    

    Plain Text

  1. ****修改渲染树

    const withRedBorder = (WrappedComponent) => {return class extends WrappedComponent {render() {const element = super.render();return React.cloneElement(element, { style: { border: "2px solid red" } });}};
    };
    

    Plain Text


****对比属性代理 vs 反向继承
****特性****属性代理****反向继承
控制方式通过包裹组件继承并覆盖原组件方法
生命周期访问无法直接访问可直接拦截/修改
适用场景添加 props/条件渲染/逻辑复用深度定制生命周期或渲染树

****注意事项
  • ****避免修改原组件:HOC 应通过组合而非修改实现功能。
  • ****Ref 传递问题:使用 ```React.forwardRef` 传递 ref 引用。
  • ****命名冲突:确保 HOC 添加的 ```props` 名称不与原组件冲突。

大白话:一个组件接受一个组件作为参数返回新的函数,这个组件就是高阶组件,接受后可以在该组件中两种用法一种是处理数据传回接受到的组件进行渲染,也就是改变props和state,或者进行条件渲染以属性代理的方式,但均不动传进起来的组件,另一种形式是将传进来的组件进行集成,类组件的继承,就拿到了该组件的所有属性包括生命周期,然后可以进行想要的操作返回新的修改过的组件

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合

概述 实时目标检测对于许多实际应用来说已经变得至关重要&#xff0c;而Ultralytics公司开发的YOLO&#xff08;You Only Look Once&#xff0c;只看一次&#xff09;系列一直是最先进的模型系列&#xff0c;在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题6)-网络部分解析-附详细代码

目录 附录1:拓扑图 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.VSU 6.SW7 7.R1 8.R2 9.R3 10.AC1 11.AC2 12.EG1 13.EG2 附录1:拓扑图 附录2:地址规划表

C#实现本地Deepseek模型及其他模型的对话

前言 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 2、此程序默认你已经安装好了Ollama。 在运行前需要线安装好Ollama,如何安装请自行搜索 Ollama下载地址&#xff1a; https://ollama.org.cn Ollama模型下载地址&#xf…

突破“第一崇拜“:五维心理重构之路

一、视频介绍 在这个崇尚"第一"的时代&#xff0c;我们如何找到自己的独特价值&#xff1f;本视频将带您踏上五维心理重构之旅&#xff0c;从诗意人生的角度探讨如何突破"圣人之下皆蝼蚁"的局限。我们将穿越人生的不同阶段&#xff0c;从青春的意气风发到…

SpringWeb

目录 一.SpringWeb 1.SpringWeb 概述 2.SpringWEB 特点 3.SpringWeb 运行流程 4.SpringWEB 组件 二.搭建SpringWeb 1.在pom.xml中导包 2.配置DispatcherServlet 3.开启SpringWEB注解 4.测试 三.接收请求 1.定义地址、请求方式 2.获取请求数据 1&#xff09;使用r…

性能测试的方案编写与执行步骤

性能测试计划书 在测试过程中我们如果编写一份性能测试计划书&#xff0c;需要一下几个背景板块及要点 性能测试的流程&#xff1a; 确认需求&#xff08;确认正确的需求) —>编写测试方案&#xff08;准备怎么动手&#xff09;测试环节—>&#xff08;尽量与生成配置一…

[AI]从零开始的树莓派运行DeepSeek模型教程

一、前言 在前面的教程中&#xff0c;教了大家如何在windows中使用llama.cpp来运行DeepSeek模型。根据前面的教程中&#xff0c;我们也了解到了&#xff0c;我们只需要编译好llama.cpp就可以运行DeepSeek以及类似的LLM模型。那么本次教程就来教大家如何使用树莓派来运行大模型。…

03_pyqt5 + vlc 实现视频播放器

1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…

Linux——高级IO(select后续poll,epoll)

目录 一、poll函数 1.函数原型 2.参数说明 3.struct pollfd 结构体 4.返回值 5.使用步骤 6.与 select 的对比 7.适用场景 8.缺点 9.总结 二、epoll函数 1.核心思想 2.核心函数 1. epoll_create - 创建 epoll 实例 2. epoll_ctl - 管理 epoll 事件表 3. epoll_w…

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图&#xff08;用户视图、DBA视图、内部视图&#xff09;的详细解释&#xff0c;结合理论与实际操作说明&#xff1a; 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想&#xff0c;MySQL 的实现逻辑如下&#xff1a; …

突破性能极限:DeepSeek开源FlashMLA解码内核技术解析

引言&#xff1a;大模型时代的推理加速革命 在生成式AI大行其道的今天&#xff0c;如何提升大语言模型的推理效率已成为行业焦点。DeepSeek团队最新开源的FlashMLA项目凭借其惊人的性能表现引发关注——在H800 GPU上实现580 TFLOPS计算性能&#xff0c;这正是大模型推理优化的…

ROS ur10机械臂添加140夹爪全流程记录

ROS ur10机械臂添加140夹爪 系统版本&#xff1a;Ubuntu20.04 Ros版本&#xff1a;noetic Moveit版本&#xff1a;moveit-noetic 参考博客&#xff1a; ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例&#xf…

Redis速成(1)VMware虚拟机安装Redis+Session验证登录注册+MybatisPlus

课程&#xff1a;黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目_哔哩哔哩_bilibili Mybatis与MybatisPlus: 参考springboot&#xff0c;需要额外写mapper.class&#xff0c;在方法上Select等 在ssm中&#xff0c;…

thinkphp下的Job队列处理

需要think-queue扩展&#xff0c;没有的请composer安装一下 "require": {"php": ">7.2.5","topthink/framework": "^6.1","topthink/think-orm": "^2.0","topthink/think-multi-app": &qu…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(五)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;五&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&…

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

VMware虚拟机Mac版安装Win10系统

介绍 Windows 10是由美国微软公司开发的应用于计算机和平板电脑的操作系统&#xff0c;于2015年7月29日发布正式版。系统有生物识别技术、Cortana搜索功能、平板模式、桌面应用、多桌面、开始菜单进化、任务切换器、任务栏的微调、贴靠辅助、通知中心、命令提示符窗口升级、文…

计算机网络:ICMP协议(Internet控制消息协议)介绍

目录 一、简介 二、为什么要有ICMP协议? 三、ICMP协议报文格式 四、ICMP报文的类型 4.1 差错报文 4.2 查询报文 五、ICMP报文的实际案例 5.1 Ping命令 5.2 Traceroute命令 总结 今天和大家聊聊ICMP协议相关的知识,感兴趣的可以一起了解一下! 一、简介 ICMP(Inte…

python读取sqlite温度数据,并画出折线图

需求&#xff1a; 在Windows下请用python画出折线图&#xff0c;x轴是时间&#xff0c;y轴是温度temperature 和体感温度feels_like_temperature 。可以选择县市近1小时&#xff0c;近1天&#xff0c;近1个月的。sqlite文件weather_data.db当前目录下&#xff0c;建表结构如下…

window下kafka安装

kafka下载 下载好,直接解压即可 默认是带有zookeeper(注册中心) 需要先启动zookeeper zookeeper配置 先配置下zookeeper 这个data文件夹是自定建的 随意建在哪里 注意 这里斜杠用和linux一样 启动zookeeper 进入bin/windows目录 启动zookeeper zookeeper-server-start.ba…