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

React-高阶组件

认识高级组件

高阶函数的维基百科定义:至少满足以下条件之一
1、接受一个或多个函数作为输入;
2、输出一个函数;

JavaScript中比较常见的 filter、map、reduce 都是高阶函数

那么说明是高阶组件呢?

  • 高阶组件的英文是 Higher-Order Components,简称为 HOC;
  • 官方的定义:高阶组件是参数为组件,返回值为新组件的函数;

我们可以进行如下的解析:

  • 首先,高阶组件 本身不是一个组件,而是一个函数;
  • 其次,这个函数的参数是一个组件,返回值也是一个组件

高阶组件的定义

import  React,{PureComponent } from 'react'
class App extends  PureComponent [
render (){return (<div>你好: {this.props.name}</div>)
}function enhanceComponent(WrappedComponent) [// 返回组件名NewComponent // return class NewComponent extends PureComponent {class NewComponent extends PureComponent {render()[return-<WrappedComponent {...this.props}/>}}//组件的名称都可以通过displayName来修改NewComponent.displayName= "kobe"; // 自定义组件名,一般开发调式才用到return  NewComponent;
}
const EnhanceComponent = enhanceComponent(App);//export default App;
export default EnhanceComponent;

效果如下,
在这里插入图片描述
使用

<EnhanceComponent name="zhangsan">
  • 高阶组件并不是React API的一部分,它是基于React的组合特性而形成的设计模式;高阶组件在一些React第三方库中非常常见:
    • 比如redux中的 connect;
    • 比如react-router中的 withRouter

高阶组件-props

案例一

import React,[ PureComponent ]  from  'react';class User1 extends PureComponent {render(){return <h3>Home: {`昵称: ${this.props.nickname} 等级: ${this.props.level} 区域:${this.props.region}`}</h3>}
}class User2 extends PureComponent {render(){return <h3>Home: {`昵称: ${this.props.nickname} 等级: ${this.props.level} 区域:${this.props.region}`}</h3>}
}
// 定义一个高阶组件
function enhanceRegionProps(WrappedComponent) {return props =>{return <WrappedComponent {...props} refion="中国" />}
}
const Person1 = enhanceRegionProps(User1 );
const Person2 = enhanceRegionProps(User2 );class App extends  PureComponent [render(){return(<div>App//	<User1 nickname="张三" level={90} />//	<User2 nickname="李四" level={30} /><Person1 nickname="张三" level={90} /><Person2 nickname="李四" level={30} /></div>}}
}
export default App ;

案例二

import React,[ PureComponent ,createContext]  from  'react';
// 创建Context
const UserContext = createContext({nickname:"momo",level:21,region:'深圳'
})
class User1 extends PureComponent {render(){return  <h3>Home: {`昵称: ${this.props.nickname} 等级: ${this.props.level} 区域:${this.props.region}`}</h3>}
}class User2 extends PureComponent {render(){return <h3>Home: {`昵称: ${this.props.nickname} 等级: ${this.props.level} 区域:${this.props.region}`}</h3>}
}
// 定义一个高阶组件
function enhanceRegionProps(WrappedComponent) {return props =>{return 	<UserContext.Consumer>{user => {//	return <h3>Home: {`昵称: ${user.nickname} 等级: ${user.level} 区域:${user.region}`}</h3>;return <WrappedComponent {...props} {...user} />}}<UserContext.Consumer/>}
}
const Person1 = enhanceRegionProps(User1 );
const Person2 = enhanceRegionProps(User2 );class App extends  PureComponent [render(){return(<div>App<UserContext.Provider value={{nickname:"why" ,level:23,region:'上海'}} ><Person1 /><Person2 /></ UserContext.Provider></div>}}
}
export default App ;

高阶组件存在的意义

  • 我们会发现利用高阶组件可以针对某些React代码进行更加优雅的处理
    其实早期的React有提供组件之间的一种复用方式是mixin,目前已经不再建议使用:

    • Mixin 可能会相互依赖,相互耦合,不利于代码维护
    • 不同的Mixin中的方法可能会相互冲突
    • Mixin非常多时,组件是可以感知到的,甚至还要为其做相关处理,这样会给代码造成滚雪球式的复杂性
  • 当然,HOC也有自己的一些缺陷:

    • HOC需要在原组件上进行包裹或者嵌套,如果大量使用HOC,将会产生非常多的嵌套,这让调试变得非常困难
    • HOC可以劫持props,在不遵守约定的情况下也可能造成冲突;
  • Hooks的出现,是开创性的,它解决了很多React之前的存在的问题口比如this指向问题、比如hoc的嵌套复杂度问题等等

Portal 的使用

某些情况下,我们希望渲染的内容独立于父组件,甚至是独立于当前挂载到的DOM元素中(默认都是挂载到id为root素上的)

  • Portal 提供了一种将子节点染到存在于父组件以外的 DOM 节点的优秀的方案:
    • 第一个参数(child)是任何可染的 React 子元素,例如一个元素字符串或 fragment;
    • 第二个参数(container)是一个 DOM 元素;就是要挂载到那个DOM上面
ReactDOM.createPortal(child,container);

通常来讲,当你从组件的 render 方法返回一个元素时,该元素将被挂载到DOM节点中离其最近的父节点

相关文章:

React-高阶组件

认识高级组件 高阶函数的维基百科定义:至少满足以下条件之一 1、接受一个或多个函数作为输入; 2、输出一个函数; JavaScript中比较常见的 filter、map、reduce 都是高阶函数 那么说明是高阶组件呢? 高阶组件的英文是 Higher-Order Components&#xff0c;简称为 HOC;官方的…...

python学习——【第一弹】

前言 Python是一种跨平台的计算机程序设计语言&#xff0c;是ABC语言的替代品&#xff0c;属于面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 从这篇…...

数据结构——链表讲解(1)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月3日 内容&#xff1a;数据结构链表讲解 目录 前言&#xff1a; 链表的概念&#xff1a; 1.为什么要有链表&#xff1a; 2.链表的运行原理&#xff1a; 3.链表的形态多少&#xff1a; 4.单链表的代码书写&#xff1…...

docker部署MySQL主从服务

一.主从同步流程关于MySQL主从复制主要同步的是binlog日志&#xff0c;涉及到三个线程&#xff0c;一个运行在主节点&#xff08;log dump thread&#xff09;&#xff0c;其余两个(I/O thread, SQL thread)运行在从节点&#xff0c;如下图所示:当主库数据发生变更时&#xff0…...

儿童护目台灯哪种好用?几款真的保护视力的台灯品牌推荐

儿童眼睛还未发育完全&#xff0c;眼睛比较脆弱&#xff0c;但是现在的小孩子学习任务也比较繁重&#xff0c;经常晚上看书写字&#xff0c;所以选择合适的护眼台灯来保护眼睛很重要。 选择儿童护目台灯需要注意以下几个方面&#xff1a; &#xff08;一&#xff09;色温和亮…...

游戏逆向基础之OD找CALL实践

在逆向中除了分析数据之外&#xff0c;另外一个重要的工作就是找算法&#xff0c;找CALL 例如各种功能函数&#xff1a;攻击CALL,走路CALL,喊话CALL等等 以及加密解密等算法需要我们先锁定其位置&#xff0c;然后进行逆向分析。 最常见方法一 API函数下断&#xff0c;例如send …...

File 文件操作

File 文件操作&#xff1a; 一、常用方法&#xff1a; 方法类型描述public File(String pathname&#xff09;构造给定一个要操作文件的完整路径public File(File parent, String child)构造给定要操作文件的父路径和子文件名称public boolean createNewFile() throws IOExce…...

QT基础(18)- QAbstractSocket

QT基础&#xff08;18&#xff09;- QAbstractSocket1 创建简单的客户端2 QAbstractSocket2.1 简介2.2 枚举2.2.1 BingFlag2.2.2 NetworkLayerProtocol2.2.3 PauseMode2.2.4 SocketError2.2.5 SocketOption2.2.6 SocketType2.2.7 SocketState2.3 公有函数2.3.1 构造函数2.3.2 a…...

机器学习与目标检测作业:安装pytorch

机器学习与目标检测作业&#xff1a;安装pytorch一、 进入官网复制下载命令二、 下载的过程2.1 conda命令运行三、 测试pytorch是否安装成功安装pytorch教程 一、 进入官网复制下载命令 进入官网复制下载命令如下图所示 二、 下载的过程 下载的过程如下图所示 2.1 conda命令运…...

Android 源码中的 JNI,到底是如何使用的?

Linux下 JNI的使用学习 Android 其中涉及对 JNI 的使用&#xff1b;JNI的使用对于 Android 来说又是十分的重要和关键。那么到底 Java 到底是如何调用 C/C 的&#xff0c;下面是非常简单的计算器源码&#xff0c;只是用来熟悉JNI的基本语法&#xff0c;其中我自己碰到过的一个问…...

重磅新品 / 酷炫展品 / 强大生态,广和通玩转 MWC Barcelona 2023

2月27日&#xff0c;2023世界移动通信大会&#xff08;MWC Barcelona 2023&#xff09;在西班牙巴塞罗那正式开幕。全球知名移动运营商、设备制造商、技术提供商、物联网企业齐聚一堂&#xff0c;以领先的技术、创新的场景、前瞻的洞察向全行业输送最新鲜的行业观点。作为全球领…...

Hbuilder+uniapp 从零开始创建一个小程序

当你看到这篇博客的时候&#xff0c;那~说明~我的这篇博客写完了……哈哈哈哈哈哈哈哈。好的&#xff0c;清耐心往下看哈。如果有需要的&#xff0c;可以关注一下小作&#xff0c;后面还有小程序的云开发嗷~一、申请一个小程序账号&#xff08;已经有账号的小可爱可以跳过&…...

亚商投资顾问早餐FM/0303支持新能源汽车消费

01/亚商投资顾问早间导读高层调研集成电路企业并主持召开座谈会商务部&#xff1a;今年将积极出台新政策措施支持新能源汽车消费商务部&#xff1a;推动农村消费进一步恢复和扩大更好助力乡村振兴干细胞应用接连获重大突破机构密集调研相关上市公司02/亚商投资顾问新闻早餐// 热…...

Spring Boot 整合分布式缓存 Memcached

Memcached是一个开源、高性能&#xff0c;将数据分布于内存中并使用key-value存储结构的缓存系统。它通过在内存中缓存数据来减少向数据库的频繁访问连接的次数&#xff0c;可以提高动态、数据库驱动之类网站的运行速度。 Memcached在使用是比较简单的&#xff0c;在操作上基本…...

嵌入式学习笔记——STM32单片机开发前的准备

STM32单片机开发前的准备1.集成开发环境的选取STM32 CubeIDEKEIL_MDK2.KEIL_MDK环境搭建安装包获取及安装芯片包下载及安装工程建立(STM32F407VET6为例)1.新建工程文件夹2.新建工程3.安装ST-LINK以及CH340的驱动4.设置KEIL&#xff0c;并烧录本文重点1.集成开发环境的选取 前面…...

客户案例|FPGA研发管理解决方案:UniPro瀑布+敏捷 打造高效能组织

2023开年以来&#xff0c;新享科技项目管理软件UniPro收获一波客户侧的点赞好评。在过去一年中&#xff0c;UniPro不断与客户保持高频沟通&#xff0c;满足客户需求为出发点&#xff0c;以产品功能实现为落脚点&#xff0c;不断打磨产品。 以UniPro客户京微齐力为例&#xff0…...

【信息学奥赛】1400:统计单词数

统计单词数也需要分割单词&#xff0c;如果使用字符数组来做的话&#xff0c;其实和1144&#xff1a;单词翻转类似&#xff0c;但是我一直只能通过四个样例&#xff0c;估计边界处理条件还是有点问题。 不过经过打印字符串长度之后发现了之前遇到的一个问题&#xff0c;即fget…...

# 技术详解: 利用CI同步文章以及多端发布

技术详解: 利用CI同步文章以及多端发布 技术详解: 利用CI同步文章以及多端发布 前言文章的同步实现的细节 思路文章元数据的定义和提取修改文章的优化本地图片资源上传CDN并替换本地link 终于到了 CI 的部分了最后来一些碎碎念 前言 前几天我更新了一篇简单技术总结之后&am…...

分形维数的计算方法汇总

以下是常用的时间序列分形维数计算方法及相应的参考文献&#xff1a;Hurst指数法Hurst指数法是最早用于计算分形维数的方法之一&#xff0c;其基本思想是通过计算时间序列的长程相关性来反映其分形特性。具体步骤是&#xff1a;(1) 对原始时间序列进行标准化处理。(2) 将序列分…...

微积分小课堂:积分(从微观趋势了解宏观变化)

文章目录 引言I. 预备知识: 积分效应1.1 闯黄灯1.2 公司利润(飞轮效应)1.3 飞轮效应II 积分2.1 积分的计算2.2 积分思想的本质引言 微分解决的问题是从宏观变化了解微观趋势;积分和微分刚好相反,是从微观去看宏观变化。 通过积分效应,提升我们的认识水平,同时能用一些工…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...