第17节——高阶组件

news/2024/7/15 19:09:23 标签: 前端, javascript, react.js

一、概念

高阶组件(Higher-Order Component,HOC)是 React 中一种代码重用的模式,它是一个函数,接受一个组件作为参数,并返回一个新的组件。它的作用是对组件进行抽象,从而在不修改组件代码的情况下,扩展组件的功能。

高阶组件的一个典型特点是在组件外层套一个新的组件,新的组件可以使用接收的组件的属性和状态,并且可以为其提供新的属性和方法。这样,我们就可以对组件进行扩展,并在多个组件中重用这些扩展功能。

总之,高阶组件是一种代码复用的有效方法,使得我们可以在不修改组件代码的情况下,对其进行扩展和重用,并统一处理一些通用问题

二、基本语法

高阶组件语法非常简单,它是一个接收组件为参数,并返回新组件的函数。语法如下:

/**
 * higherOrderComponent 是高阶组件函数
 * WrappedComponent 是被包装的组件
 * newComponent 返回的新组件
 */
const newComponent = higherOrderComponent(WrappedComponent);

三、例子

封装一个高阶组件,使用的组件延迟3秒展示

import React from "react";

/**
 * 创建一个延时加载的高阶组件
 * @param {} WrappedComponent
 * 接收到的组件,就是把这个组件延时三秒展示
 * @returns
 */
export default function delyLoadComponent(WrappedComponent) {
  
  /**
   * 返回一个组件
   * 这个组件我们正常创建即可
   */
  return class DelyLoadComponent extends React.Component {
    state = {
      isLoad: false,
    };

    componentDidMount() {
      setTimeout(() => {
        this.setState({
          isLoad: true,
        });
      }, 3000);
    }

    render() {
      /**
       * 返回我们接收到的组件
       * 并且给这个返回加上相应的逻辑
       */
      return this.state.isLoad ? <WrappedComponent /> : <div>加载中</div>;
    }
  };
}

页面使用

import React from "react";
import LearnRef2 from "./learn-ref2";
import delyLoadComponent from "./learn-hoc";
export default delyLoadComponent(
  class LearnRef extends React.Component {
    render() {
      return (
        <div>
           组件内容
        </div>
      );
    }
  }
);

四、使用场景

1、数据获取:高阶组件可以在组件挂载时自动获取数据,并将数据通过 props 传递给被包装组件。

2、权限控制:高阶组件可以检查用户是否有访问该组件的权限,从而决定是否渲染该组件。

3、代码重用:高阶组件可以通过封装一些常见的逻辑,来提高代码的复用性。

4、状态管理:高阶组件可以管理一些状态,并通过 props 将状态传递给被包装组件,如redux里的connect。

5、表单处理:高阶组件可以处理表单的数据,包括数据验证、数据提交等,antd里面的Form。

6、设计模式:高阶组件可以作为设计模式的一部分,例如实现观察者模式、策略模式等

简单来说高阶组件可以很方便地在组件中统一处理一些通用问题,比如鉴权、数据获取等。例如,我们可以创建一个高阶组件,用来在组件加载前检查用户是否已登录,并在必要时跳转到登录页面等。

五、常用的高阶组件

withRouter

路由的高阶组件,在类组件里如果想要使用路由必须要使用高阶组件,才可以拿到路由相关的方法

connect

redux连接组件的高阶组件,connect后可以拿到redux里的所有状态和方法

Form

antd 提供的一个高阶组件,用于获取表单数据


http://www.niftyadmin.cn/n/5010324.html

相关文章

C++,day0907

#include <iostream>using namespace std; struct stu { private:int num; private:double score[32];public:void setNum(){cout <<"请输入学生人数:";cin >>num;}void input(){cout<<"请输入学生的成绩:"<<endl;for(int i…

基于SpringBoot+thymeleaf的物资管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 这是一个物资管理系统…

java+ssm+mysql小区疫情管理系统

项目介绍&#xff1a; 使用javassmmysql开发的小区疫情管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、居民用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;首页图表统计、管理员管理、居民管理、物资管理、诊断管理、疫苗接种、访客管理…

算法通关村第十七关:黄金挑战-跳跃游戏问题

黄金挑战-跳跃游戏问题 1. 跳跃游戏 LeetCode 55 https://leetcode.cn/problems/jump-game/ 思路分析 关键是判断能否到达终点&#xff0c;不用管每一步跳跃到哪里&#xff0c;而是尽可能的跳跃到最远的位置 看最多能覆盖到哪里&#xff0c;只要不断更新能覆盖的距离&#x…

解释模块化开发及其优势,并介绍常用的模块化规范。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 模块化开发⭐ 模块化开发的优势⭐ 常用的模块化规范⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是…

2023国赛数学建模E题思路代码 - 黄河水沙监测数据分析

# 1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

学校ROS培训项目记录

项目内容&#xff1a; 在linux上安装ROS&#xff08;可以使用虚拟机&#xff09;编写ROS程序&#xff0c;实现话题的订阅和发布基于松灵小车硬件&#xff0c;显示雷达数据、图像数据移动松灵小车&#xff0c;绘制小车的运动轨迹 实现过程记录 1.ubuntu22.04上安装ros2 ubun…

Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit

一、集成Log4j2⽇志框架 从Spring5之后&#xff0c;Spring框架⽀持集成的⽇志框架是Log4j2.如何启⽤⽇志框架&#xff1a; 第⼀步&#xff1a;引⼊Log4j2的依赖 <!--log4j2的依赖--> <dependency><groupId>org.apache.logging.log4j</groupId><a…