您的位置:

React HOC 全揭秘

一、什么是React HOC?

React HOC(Higher-Order Component)指的是一种高阶组件,通过包装现有组件来增强组件的能力,使其具有更高的复用性和可维护性。

具体来说,HOC本质上是一个函数,它接收一个组件作为参数,并返回一个包裹了原组件的新组件。使用HOC,我们可以将公共逻辑、状态和属性提取到一个单独的组件中,而不需要在多个组件中重复编写相同的代码。

HOC的工作原理是,通过将组件包裹在一个中间层组件中,这个中间层组件可以访问原组件的props和state,并且可以对其进行修改和增强。


function withLoading(Component) {
  return function WrappedComponent(props) {
    const [isLoading, setLoading] = useState(false);

    return (
      
   
{isLoading &&
Loading...
}
); }; }

这里我们以一个简单的 loading 组件为例,通过使用 useState hook 来记录组件状态,返回一个新的组件包裹原组件,新组件每次都会查询`isLoading`状态来判断是否显示 loading 动画。

二、React HOC的优势

1、代码复用

HOC 可以将一些不相关的逻辑和状态提取出来,从而为多个组件提供统一的代码和功能。这种方式大大降低了组件编写和维护的成本。


const withCounter = (WrappedComponent) => {
  class WithCounter extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        count: 0,
      };
    }
    handleIncrement = () => {
      this.setState((prevState) => ({ count: prevState.count + 1 }));
    };
    render() {
      return (
        
   
      );
    }
  }
  return WithCounter;
};

如上代码所示,我们通过定义一个 withCounter 高阶组件来处理 state 和事件,将这些公共逻辑从多个组件中提取出来。这样,我们就可以在多个组件上使用这些公共逻辑。

2、逻辑复用

除了可以提供代码的复用,HOC还可以提供逻辑的复用,丰富了组件的实现方式。

举个例子,我们定义了一个具有检测网络状态的高阶组件,该组件会通过 navigator.onLine 值来检查联网状态,如果没有网络连接,它会渲染一个网络错误的提示组件。我们可以将这个高阶组件与任何需要联网检测的组件进行连接,并提供网络状态的监控支持。


const withNetworkStatus = (WrappedComponent) =>
  class extends React.Component {
    state = {
      isOnline: navigator.onLine,
    };

    componentDidMount() {
      window.addEventListener('online', this.onOnline);
      window.addEventListener('offline', this.onOffline);
    }

    componentWillUnmount() {
      window.removeEventListener('online', this.onOnline);
      window.removeEventListener('offline', this.onOffline);
    }

    onOnline = () => {
      this.setState({ isOnline: true });
    };

    onOffline = () => {
      this.setState({ isOnline: false });
    };

    render() {
      return 
   ;
    }
  };

3、良好的封装性

HOC 可以作为一个中间层组件,可以将一些不必要的组件暴露出去。这样,对于外部组件来说,它只知道自己渲染了什么但并不了解其内部实现。

三、React HOC注意点

1、不要改变原组件

HOC封装后的组件,应该同样遵循React的不可变性原则,原组件不会被修改或变形。任何组件的状态和属性都应该是不可变的。

2、注意props冲突问题

在使用多个高阶组件包装同一个组件时,需要注意 props 名称的唯一性,以免不同的高阶组件之间发生冲突。

3、高阶组件命名

通常命名习惯是以 with 开头,然后根据功能或者属性对其进行别名。

四、React HOC的应用场景

1、Redux 与 React

Redux 库仅仅是一个支持状态管理的工具。Redux并不限制仅在React中使用。但是,在React中使用Redux实现状态管理需要使用React Redux库。Redux本身并不支持React,我们需要将Redux与React连接起来以实现业务逻辑。

通过使用connect函数,我们可以将Redux仓库内的状态和属性映射到原有的组件中。这种方式非常符合React组件化的基本原则,大大提高了组件的可维护性和可重用性。

2、鉴权处理

在用户认证流程中,鉴权处理是一个必要的步骤。为了避免与业务逻辑混杂,我们可以使用高阶组件的方式将鉴权流程单独管理,并绑定到子组件中。


const withAuth = (WrappedComponent) => {
  class WithAuth extends React.Component {
    state = {
      isAuth: false,
    };

    componentDidMount() {
      if (user is authenticated) {
        this.setState({ isAuth: true });
      }else{
         redictToLogin()
      } 
    }

    render() {
      return this.state.isAuth ? 
    : null;
    }
  }
  return WithAuth;
};

如上代码所示,我们定义了一个高阶组件,它先验证用户是否认证通过,如果认证则返回原组件,否则跳转到登录界面。

3、路由处理

React Router提供高阶组件以向传入的子组件注入路由相关属性,这为组件的开发提供了便利,避免了组件间传递路由变量的不便。


import { withRouter } from 'react-router-dom';

const WithRouterComponent = ({ history }) => (
  
);

const ComponentWithRouter = withRouter(WithRouterComponent);

这里通过withRouter将路由相关属性绑定到组件中,使其可以方便地操作路由。

五、总结

React HOC通过包装现有组件来扩展、增强或修改组件的能力,使得组件具有更好的复用性和可维护性。使用高阶组件能减少代码量,实现逻辑复用等优秀特性,为React组件化开发提供了新的思路。但是,需要注意的是,高阶组件的必要性建立在模块化和封装性的前提之上。因此,在使用HOC之前,我们要首先明确我们要实现什么功能,是否符合模块化组件,是否值得使用高阶组件等问题。

React HOC 全揭秘

2023-05-17
reactjs源码揭秘,react 代码

本文目录一览: 1、React作为时下最热的前端框架,各位有什么经验分享下吗 2、如何在react中加入js源码 3、如何利用React.js开发出强大Web应用 4、如何用reactjs构建一个完整

2023-12-08
React常见面试题详解

2023-05-22
java方法整理笔记(java总结)

2022-11-08
Python高清图片揭秘

本文将从多个方面对Python高清图片进行详细的阐述,揭秘其背后的原理与技术。无论是在科学研究、图形处理还是网站设计中,高清图片都起到了至关重要的作用。让我们一起来探索Python如何处理高清图片吧!

2023-12-08
印象笔记记录java学习(Java成长笔记)

2022-11-12
揭秘Pixiv这个画板的独特魅力

2023-05-18
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
React拖拽入门指南

2023-05-18
使用Reacticon构建响应式站点的秘籍

2023-05-17
java学习笔记(java初学笔记)

2022-11-14
React阮一峰综述

2023-05-18
mysql如何整合数据库,如何整合表格数据

2022-11-18
java笔记,大学java笔记

2022-11-28
VPS绑定域名技巧大揭秘

1: vps怎么绑定域名 1、解析自己的域名到服务器IP。 2、增加A记录到服务器IP。 3、地区不同需要等待核备生效。 4、远程连接服务器。 5、找到需要绑定域名的网站。 6、右键属性,点击高级按钮

2023-12-08
java笔记,尚硅谷java笔记

2022-12-01
java客户端学习笔记(java开发笔记)

2022-11-14
python基础学习整理笔记,Python课堂笔记

2022-11-21
React路由传参完全指南

2023-05-20
发篇java复习笔记(java课程笔记)

2022-11-09