React高阶组件详解

文章目录

    • 高阶组件是什么?
    • 认识高阶组件
    • 编写高阶组件
    • 高阶组件实践
    • 推荐文章

高阶组件是什么?

高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。

高阶组件是参数为组件,返回值为新组件的函数

在此期间,我们可以对该组件进行props处理,事件处理等工作

认识高阶组件

  1. 复用逻辑

    对组件进行加工处理,根据需求来定制专属化的HOC

  2. 强化props

    劫持上一层传过来的props,混入新的props

  3. 赋能组件

    HOC有一项独特的特性,就是可以给被HOC包裹的业务组件,提供一些拓展功能,比如说额外的生命周期,额外的事件,但是这种HOC,可能需要和业务组件紧密结合

  4. 控制渲染

    劫持渲染是hoc一个特性,在wrapComponent包装组件中,可以对原来的组件,进行条件渲染,节流渲染,懒加载等功能

使用方式

  • 装饰器模式

  • 函数包裹

两种不同的高阶组件

  • 正向的属性代理

      function HOC(WrapComponent){return class Advance extends React.Component{state={name:'loong'}render(){return <WrapComponent  { ...this.props } { ...this.state }  />}}}
    

    我们来看一下上面这个例子,return 返回结果是父组件(代理组件)对子组件(业务组件)的一系列操作

    在 fiber tree上,先mounted组件,然后才是我们的业务组件

  • 反向的组件继承

        class Index extends React.Component{render(){return <div> hello,world  </div>}}function HOC(Component){return class wrapComponent extends Component{}}export default HOC(Index) 
    

    HOC采用继承的方式, 代理组件继承了业务组件的本身,我们在使用的时候直接实例化代理组件HOC即可

编写高阶组件

很多文章对其有很多分类,我这里就按照我的理解去分类
  1. 增强props
    混入props 代理组件state状态会混入(上面有混入的例子), 初次之外我们还可以进行控制state的更新

    function classHOC(WrapComponent){return class  Idex extends React.Component{constructor(){super()this.state={name:'alien'}}changeName(name){this.setState({ name })}render(){return <WrapComponent { ...this.props }  { ...this.state } changeName={this.changeName.bind(this)  }  />}}
    }
    function Index(props){const [ value ,setValue ] = useState(null)const { name ,changeName } = propsreturn <div><div>   hello,world , my name is { name }</div>改变name <input onChange={ (e)=> setValue(e.target.value)  }  /><button onClick={ ()=>  changeName(value) }  >确定</button></div>
    }export default classHOC(Index)
    

    我们看这个例子,代理组件中changeName={this.changeName.bind(this)} ,绑定changeName方法。用来更新name属性(代理组件中,说实话让我想起来了闭包)。

    题外话:上面的例子中changeName绑定的是一个函数,然后利用bind改变其this指向(返回值是一个函数),在Index组件使用的时候<button onClick={ ()=> changeName(value) } >确定</button> , 才可以正确更新到代理组建的state。如果不绑定就会找不到该方法。

  2. 控制渲染
    代理组件通过处理可以控制子组件是否显示

    可以通过变量控制,也可以通过其它方式。达到控制渲染的目的就可以了

    我们来看一个优化的例子💨

        function HOC (Component){return function renderWrapComponent(props){const { num } = propsconst RenderElement = useMemo(() =>  <Component {...props}  /> ,[ num ])return RenderElement}}class Index extends React.Component{render(){console.log(`当前组件是否渲染`,this.props)return <div>hello,world, my name is alien </div>}}const IndexHoc = HOC(Index)export default ()=> {const [ num ,setNumber ] = useState(0)const [ num1 ,setNumber1 ] = useState(0)const [ num2 ,setNumber2 ] = useState(0)return <div><IndexHoc  num={ num } num1={num1} num2={ num2 }  /><button onClick={() => setNumber(num + 1) } >num++</button><button onClick={() => setNumber1(num1 + 1) } >num1++</button><button onClick={() => setNumber2(num2 + 1) } >num2++</button></div>}
    

    上面的例子应该很好理解,代理组件通过useMemo钩子来依据props传入的num,来决定是否更新子组件

  3. 劫持生命周期

    function HOC (Component){const proDidMount = Component.prototype.componentDidMount Component.prototype.componentDidMount = function(){console.log('劫持生命周期:componentDidMount')proDidMount.call(this)}return class wrapComponent extends React.Component{render(){return <Component {...this.props}  />}}
    }
    

    也是很好理解,代理组件保存子组建的生命周期函数,然后重新设置对应的生命周期函数

  4. 事件处理

    我们来看分析下面这个例子💨

    function ClickHoc (Component){return  function Wrap(props){const dom = useRef(null)useEffect(()=>{const handerClick = () => console.log('发生点击事件') dom.current.addEventListener('click',handerClick)return () => dom.current.removeEventListener('click',handerClick)},[])return  <div ref={dom} ><Component  {...props} /></div>}
    }
    

    其实就是代理组件上面加了一个click监听事件

  5. 获取自定义组件ref

    我们知道在自定义组件上面ref是无用的,我们可以使用代理组件包裹业务组件即可,ref={dom}在代理组件上,即可获取

     return  <div ref={dom} ><Component  {...props} /></div>
    

高阶组件实践

可以参卡`推荐文章`中的这一章节,写的很详细

推荐文章

「react进阶」一文吃透React高阶组件(HOC)

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

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

相关文章

Android Studio 打包 Maker MV apk 详细步骤

一.使用RPG Make MV 部署项目&#xff0c;获取项目文件夹 这步基本都不会有问题&#xff1a; 二.安装Android Studio 安装过程参考教材就行了&#xff1a; https://blog.csdn.net/m0_62491877/article/details/126832118 但是有的版本面板没有Android的选项&#xff08;勾…

python --阿里云(智能媒体管理/视频点播)

智能媒体服务获取token # alibabacloud_imm202009304.1.0 class Sample(object):智能媒体服务def __init__(self):self.access_key 111self.key_secret 222def weboffice_permission(self):return imm_20200930_models.WebofficePermission(renameFalse,readonlyTrue,histor…

在Linux/Ubuntu/Debian上创建指向文件夹或文件的快捷方式

使用带有“-s”选项的“ln”命令&#xff1a; ln -s 命令创建一个符号链接。 这是完整的语法&#xff1a; ln -s <target> <link_name><target>&#xff1a;这是你要链接到的文件或目录的路径。<link_name>&#xff1a;这是你要创建的符号链接的名称…

关于安卓文件夹压缩和解压(一)zip处理

背景 把文件压里头 把文件夹压里头 相关参考 我之前的一个文章&#xff0c;文件递归复制思路link 思路 如果把单单一个文件压缩&#xff0c;那么恭喜你&#xff0c;不用看这个文章了&#xff0c;因为百度一搜就有不错的答案。 本文主要介绍&#xff0c;如果把整个文件夹压…

描述CSS选择器及其优先级规则

一․描述一下CSS选择器及其优先级规则 CSS选择器是用于指定CSS样式应应用于哪些HTML元素的模式。通过选择器&#xff0c;我们可以定位到特定的元素或元素组&#xff0c;并为它们应用样式。CSS选择器有多种类型&#xff0c;每种类型都有其特定的用途和语法。 以下是几种常见的…

Python数据分析与可视化笔记一 机器学习概述

机器学习是一种从数据当中发现复杂规律&#xff0c;并且利用规律对未来时刻、未知状况进行预测和判定的方法&#xff0c;是当下被认为最有可能实现人工智能的方法之一。 所有数据的集合称为数据集(dataset)&#xff0c;其中每条记录是关于一个事件或对象的描述&#xff0c;称为…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

LM2903BIDR比较器芯片中文资料规格书PDF数据手册参数引脚图功能封装尺寸图

产品概述&#xff1a; M393B 和 LM2903B 器件是业界通用 LM393 和 LM2903 比较器系列的下一代版本。下一代 B 版本比较器具有更低的失调电压、更高的电源电压能力、更低的电源电流、更低的输入偏置电流和更低的传播延迟&#xff0c;并通过专用 ESD 钳位提高了 2kV ESD 性能和输…

【CenterFusion】模型的创建、导入、保存CenterFusion/src/lib/model/model.py

文件内容&#xff1a;CenterFusion/src/lib/model/model.py 文件作用&#xff1a;模型的创建、导入、保存 model.py 具体内容如下&#xff1a; from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport torchv…

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;https://…

将VSCode添加至右键的菜单栏

懒得bb&#xff0c;直接转发别人的博客&#xff0c;链接 但是我在win11上面弄了之后&#xff0c;除了文件夹其他格式都生效了&#xff0c;只需要在这个路径HKEY_CLASSES_ROOT\Directory\shell重复上面的操作&#xff0c;看Directory就知道是文件夹

担忧关于ChatGPT潜在风险的声音正在增强,但暂停人工智能是否明智?

深度学习算法的风险与挑战&#xff1a;ChatGPT的潜在风险引发关注 引言 随着人工智能技术的快速发展&#xff0c;特别是像ChatGPT这样的大型语言模型的广泛应用&#xff0c;人们对其潜在风险的关注也在不断升温。本文将探讨这些风险&#xff0c;并分析是否应该暂停AI的发展。…

事务、并发、锁机制的实现

配置全局事务 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mydb,USER:root,PASSWORD:pass,HOST:127.0.0.1,PORT:3306,ATOMIC_REQUESTS: True, # 全局开启事务&#xff0c;绑定的是http请求响应整个过程# (non_atomic_requests可局部实现不让事务控制)} } …

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍&#xff1a;Stable Diffusion&#xff5c;图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像&#xff0c;新建…

UnityShader(十六)凹凸映射

前言&#xff1a; 纹理的一种常见应用就是凹凸映射&#xff08;bump mapping&#xff09;。凹凸映射目的就是用一张纹理图来修改模型表面的法线&#xff0c;让模型看起来更加细节&#xff0c;这种方法不会改变模型原本的顶点位置&#xff08;也就是不会修改模型的形状&#xf…

数据结构之顺序存储-顺序表的基本操作c/c++(创建、初始化、赋值、插入、删除、查询、替换、输出)

学习参考博文&#xff1a;http://t.csdnimg.cn/Qi8DD 学习总结&#xff0c;同时更正原博主在顺序表中插入元素的错误。 数据结构顺序表——基本代码实现&#xff08;使用工具&#xff1a;VS2022&#xff09;&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdi…

uniapp canvas文字和元素居中

文字居中&#xff1a;ctx.textAlign "center"; 元素居中&#xff1a;ctx.arc(screenWidth / 2, 122, 40, 0, 2 * Math.PI); ctx.arc()的x轴为当前屏幕的宽度/2&#xff1b; let screenWidth 540; let screenHeight 960; // 头像 if (photoimg) {ctx.setFillSty…

gitlab cicd问题整理

1、docker设置数据目录&#xff1a; 原数据目录磁盘空间不足&#xff0c;需要更换目录&#xff1a; /etc/docker/daemon.json //写入/etc/docker/daemon.json {"data-root": "/data/docker" } 2、Dockerfile中ADD指令不生效 因为要ADD的文件被.docker…

指南:在各主流操作系统上安装与配置Apache Tomcat

指南&#xff1a;在各主流操作系统上安装与配置Apache Tomcat Apache Tomcat作为一款广受欢迎的开源Java Servlet容器&#xff0c;为用户提供了一个纯Java环境下的Web服务器和Servlet容器。本文将详细介绍如何在不同的操作系统上安装Apache Tomcat&#xff0c;并进行基本的配置…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…