[emailprotected](10)HOC高阶组件和横切关注点

目录

  • 1,什么是HOC
  • 2,什么是横切关注点
    • 2.1,简单理解
    • 2.2,常见解决方式
  • 3,HOC 举例
    • 3.1,全局功能
    • 3.2,小范围使用
  • 4,HOC 使用注意点
    • 4.1,不要在 render 中使用
    • 4.2,不要在高阶组件内部修改传入的组件
    • 4.3,只做一件事

1,什么是HOC

  • HOF:Heighter-Order Function。高阶函数,以函数为参数并返回一个函数。
  • HOC:Higher-Order Components。高阶组件,以组件为参数并返回一个组件。

2,什么是横切关注点

2.1,简单理解

在系统中横跨了多个模块或组件的,需要考虑的一些特定逻辑或领域(关注点)。它们和业务逻辑相独立,但在系统中多个部分重复出现。

这些关注点,都属于辅助功能,服务于核心功能–>业务逻辑。

对前端来说,常见的:

  • 日志记录。在多个位置都需要记录信息,以便于调试和监控。
  • 异常处理。在多个位置都需要捕获和处理异常。
  • 依赖注入。可以管理组件之间的依赖关系,比如在多个位置都需要组件的实例。
  • 状态管理。不多赘述。
  • 国际化。不多赘述。

2.2,常见解决方式

Vue 中的组件封装,mixin、hooks(Vue3)、自定义指令、状态管理,路由守卫都属于解决该问题的范畴。

React 中的组件封装,HOC,hooks,Context,状态管理也属于解决该问题的范畴。

一些设计模式:装饰器模式,观察者模式,责任链模式(处理审批)。

3,HOC 举例

React 中,通常会以 src/HOC 创建目录,文件名以 with 开头

使用 React16 进行开发离不开 HOC,无论是第3方库还是日常开发。下面只是简单举例,后面的文章也会遇到 HOC 的使用。

3.1,全局功能

比如,日志记录:

import { Component } from "react";export default function withLog(Comp) {return class LogWrapper extends Component {componentDidMount() {console.log(`${Comp.name}组件被创建了`);}componentWillUnmount() {console.log(`${Comp.name}组件被销毁了`);}render() {return <Comp {...this.props} />;}};
}

使用

import HelloWorld from "./components/HelloWorld";
import withLog from "./HOC/withLog";const Alog = withLog(HelloWorld)

因为是函数,所以可嵌套来增加多个额外功能。

const ResultComp = withLogin(withLog(CompA))

3.2,小范围使用

比如生成遍历循环的选项。

import { Component } from "react";
export default function withDataGroup(Comp) {return class DataGroupWrapper extends Component {static defaultProps = {datas: [],};render() {const comps = this.props.datas.map((it) => <Comp key={it.value} info={it} {...this.props} />);return <>{comps}</>;}};
}

Select 组件。保持源数据 data 数据结构一致时,checkbox 组件也可以使用 withDataGroup

import { Component } from "react";
import withDataGroup from "./HOC/withDataGroup";class Option extends Component {render() {return <option value={this.props.info.value}>{this.props.info.text}</option>;}
}const OptGroup = withDataGroup(Option);export default class Select extends Component {render() {return (<selectvalue={this.props.value}onChange={(e) => {this.props.onChange?.(e.target.value);}}><OptGroup {...this.props}></OptGroup></select>);}
}

使用

import React, { Component } from "react";
import Select from "./components/Select";const datas = [{ value: "football", text: "足球" },{ value: "basketball", text: "篮球" },{ value: "movie", text: "电影" },
];export default class App extends Component {state = {value: "",datas,};handleChange = (value, name, e) => {this.setState({value,});};render() {return (<><div>{this.state.value}</div><Select {...this.state} onChange={this.handleChange} /></>);}
}

4,HOC 使用注意点

4.1,不要在 render 中使用

因为这样每次都会创建新的组件,效率低而且状态每次都会重置。

4.2,不要在高阶组件内部修改传入的组件

高阶组件内部,只应该增加功能。如果修改了原组件,会导致代码逻辑混乱,而且这种情况,逻辑写到原组件更合理。

4.3,只做一件事

一般只做一件事。这样代码比较简洁,原组件也方便扩展其他功能。


以上。

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

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

相关文章

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还能取决于各个事件的相对发生顺序。状态…

不同网段的通信过程

这里的AA和HH指的是mac地址&#xff0c;上面画的是路由器 底下的这个pc1&#xff0c;或者其他的连接在这里的pc&#xff0c;他们的默认网关就是路由器的这个192.168.1.1/24这个接口 来看看通信的过程 1、先判断&#xff08;和之前一样&#xff09; 2、去查默认网关&#xf…

基于SpringBoot和Hutool工具包实现的验证码案例

目录 验证码案例 1. 需求 2. 准备工作 3. 约定前后端交互接口 需求分析 接口定义 4. Hutool 工具介绍 5. 实现验证码 后端代码 前端代码 6. 运行测试 验证码案例 随着安全性的要求越来越高&#xff0c;目前项目中很多都会使用验证码&#xff0c;只要涉及到登录&…

MySQL Mysqldump备份时的错误提示

MySQL Mysqldump备份时的错误提示 执行mysqldump备份数据库时&#xff0c;命令如下&#xff1a; mysqldump -h8.137.112.148 -udbusername -pdbpassword dbname > /opt/backup_mysql/bkdata/$(date "%Y%m%d%H%M%S")出现以下错误&#xff1a; mysqldump: Could…

Liunx系统中修改文件的创建时间以及访问时间

在Linux系统中&#xff0c;可以使用touch命令来修改文件的时间戳。以下是一些常用的touch命令选项&#xff1a; &#xff08;其实在MacOS中也适用&#xff09; 修改访问时间&#xff08;Access Time&#xff09;和修改时间&#xff08;Modification Time&#xff09;&#xf…

Celery的Web监控工具Flower

1 简介Flower Flower官网 Flower是一个WEB端的监控工具&#xff0c;可以监控Celery的消费者。但是WEB端的监控对于监控系统来说&#xff0c;有个屁用&#xff0c;有用的是监控告警。还好Flower不是全部是垃圾&#xff0c;它提供的Prometheus的监控端点。然而。。。。。如何保证…

CorelCAD v2022.5 解锁版 安装教程(2D制图 3D设计和打印的简化软件)

前言 CorelCAD&#xff0c;加拿大Corel公司开发的一款适用于2D制图、3D设计和打印的简化版CAD软件。它是款专业的2D制图和3D设计软件&#xff0c;拥有行业标准文件兼容性&#xff0c;支持 .DWG、.STL、.PDF、 .CDR*等文件格式&#xff0c;轻松实现协作和项目共享&#xff0c;利…

Linux中apt是什么?apt与apt-get有什么区别?

相信大家刚安装完Ubuntu系统后除了最基本的Linux操作&#xff0c;接触较多的命令就是apt了&#xff0c;那么这家伙到底是个什么呢&#xff1f; apt是一个在Ubuntu和Debian等Linux发行版中用于包管理的命令行工具。它是Advanced Package Tool&#xff08;高级软件包工具&#xf…

学 Go 具体能干什么?

学习 Go (Golang) 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;Go 语言以其高性能、并发处理和简洁的语法而闻名&#xff0c;特别适合以下几个领域&#xff1a; 1. 后端开发 Go 在后端开发中非常流行&#xff0c;特别适合构建高性能的 Web 服务和 API。 Web 框…

初识Spring Cache:如何简化你的缓存处理?

文章目录 1、Spring Cache介绍2、 常用注解3、 使用案例 1、Spring Cache介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的…

【机器学习】基于核的机器学习算法(Kernel-based Algorithms):原理,应用与优化

&#x1f440;传送门&#x1f440; 文章引言&#x1f50d;&#x1f340;核函数的概念&#x1f680;基于核的算法原理&#x1f496;基于核的算法应用&#x1f41f;支持向量机&#xff08;SVM&#xff09;&#x1f4d5;核主成分分析&#xff08;KPCA&#xff09; &#x1f340;未…

头歌使用GDB调试程序nav第1关:基本实验工具 GDB 的使用

编程要求 根据提示&#xff0c;在右侧编辑器补充代码,完成对 main.c 程序的编译&#xff0c;并在代码第 4 行和第 6 行设置断点。在GDB中运行程序&#xff0c;每次遇到断点时&#xff0c;对变量 a 进行打印输出。 &#xff08;请不要对 main.c 进行修改&#xff09; main.c #in…

红队攻防渗透技术实战流程:云安全之云原生安全:内核漏洞和版本漏洞

红队云攻防实战 1. 云原生安全 -Docker安全-容器逃逸-版本漏洞1.1 容器逃逸-版本漏洞-runC容器逃逸1.2 实战案例-版本漏洞-runC容器逃逸1.3 容器逃逸-版本漏洞-containerd逃逸1.4 实战案例-版本漏洞-containerd逃逸1.5 Docker安全-容器逃逸-CDK自动化1.6 Docker安全-容器逃逸-c…

【算法训练 day39 单调递增的数字】

目录 一、二分查找-LeetCode 704思路实现代码1.左闭右闭 问题总结 一、二分查找-LeetCode 704 Leecode链接: leetcode 704 文章链接: 代码随想录 视频链接: B站 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数…

大数据信用报告查询有哪些作用?哪个平台更好?

大数据信用是基于大数据技术&#xff0c;通过大数据系统生成的大数据信用报告&#xff0c;报告收集了查询人在非银环境下的申贷数据以及履约行为和信用风险的综合性报告。很多人都会问&#xff0c;大数据信用报告查询有哪些作用?哪个查询平台更好的疑问&#xff0c;下文就详细…

python中神奇的装饰器

需求&#xff1a;实现一个可以统计代码的运行时间-CSDN博客 装饰器就是我们常见的在类或函数上的装饰器&#xff0c;比如unittest里ddt&#xff0c;它可是一种好用的工具。如果你同事写了一坨代码&#xff0c;你想给这一坨代码扩展新的功能&#xff0c;这个时候就用到了装饰器…

图像处理神经网络数据预处理步骤的详细解释和分析

1. 尺寸调整&#xff08;Resizing&#xff09; 目的&#xff1a;神经网络通常需要固定尺寸的输入图像。通过统一图像尺寸&#xff0c;可以确保输入的一致性&#xff0c;使得网络能够正常处理。 方法&#xff1a;将所有输入图像调整为特定的尺寸&#xff08;例如224x224像素&a…

C++STL---string知识汇总

前言 我们现在开始CSTL的学习&#xff0c;从这时开始我们就要锻炼自己查看英文文档的能力&#xff0c;每种数据结构都有上百个接口函数&#xff0c;我们把他们全部记下来是不可能的&#xff0c;所以我们只记最常见的20几个接口&#xff0c;其他的大概熟悉有什么功能&#xff0…

深入JVM元空间以及弹性伸缩机制

个人博客 深入JVM元空间以及弹性伸缩机制 | iwts’s blog JVM内存模型中元空间所在位置 即在JVM运行时的内存模型。总体上有这样的图&#xff1a; 元空间 上面的图其实有点不太准。方法区本质上只是JVM的一个标准&#xff0c;不同JVM在不同版本下都可能有不同的实现&#x…

Matlab中函数或变量 ‘eeglab‘ 无法识别

EEGLAB 没有安装或添加到 MATLAB 路径中&#xff1a; 确保已经安装了 EEGLAB&#xff0c;并且将其添加到 MATLAB 的路径中。您可以通过在 MATLAB 命令窗口中运行 which eeglab 来检查是否能够找到 EEGLAB。 EEGLAB 函数路径设置错误&#xff1a; 如果已经安装了 EEGLAB&#x…