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

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,或者进行条件渲染以属性代理的方式,但均不动传进起来的组件,另一种形式是将传进来的组件进行集成,类组件的继承,就拿到了该组件的所有属性包括生命周期,然后可以进行想要的操作返回新的修改过的组件

相关文章:

  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(六) -> CSS动画
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter24-网络请求与远程资源
  • Spring Framework测试工具MockMvc介绍
  • 小程序类目调整汇总公告
  • Springer独立出版 EI检索 | 2025年第三届绿色建筑国际会议(ICoGB 2025)
  • 【SRC实战】修改金币数量实现财富自由
  • ARM Coretex-M核心单片机(STM32)找到hardfault的原因,与hardfault解决方法
  • rk3588增加独立分区
  • 【自学笔记】Vue基础知识点总览-持续更新
  • 智能运维语义标注体系技术框架与工程化实践
  • 【嵌入式原理设计】实验六:倒车控制设计
  • 深入Linux序列:进程的终止与等待
  • Python Cookbook-2.13 使用C++的类iostream语法
  • SSD网络预测与训练阶段总结
  • mysql多表查询
  • 【嵌入式Linux应用开发基础】网络编程(4):UDP协议
  • 数字可调控开关电源设计(论文+源码)
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(七)
  • ubuntu安装docker compose
  • 2015-2025大连社保年度缴费基数
  • 道指跌逾100点,特斯拉涨近5%
  • 巴基斯坦称成功拦截印度导弹,空军所有资产安全
  • 习近平会见古共中央第一书记、古巴国家主席迪亚斯-卡内尔
  • 江西暴雨强对流明显,专家:落雨区高度重叠,地质灾害风险高
  • 红场阅兵即将开始!中国人民解放军仪仗队亮相
  • 外交部答澎湃:美方攻击抹黑中加关系与合作的卑劣图谋不会得逞