React-高阶组件

news2024/11/26 18:20:04

认识高级组件

高阶函数的维基百科定义:至少满足以下条件之一
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节点中离其最近的父节点

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

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

相关文章

2023年如何通过软考初级程序员?

初级的考试难度不大&#xff0c;稍微有点编程基础&#xff0c;认真备考应该没什么大问题。 先清楚大纲&#xff1a; 高效备考&#xff01;理清考点&#xff0c;针对性复习 科目一&#xff1a;综合知识 75道单项选择题&#xff0c;1题1分&#xff0c;时长150分钟&#xff1b;…

Qt 防止程序退出

文章目录摘要QWidgetQML方法 1方法 2关键字&#xff1a; Qt、 eventFilter、 Close、 键盘、 任务管理器摘要 今天要聊得内容还是怎么防止别人关闭我的程序&#xff0c;之前都是在win下面&#xff0c;一般都是用过钩子连捕获键盘事件&#xff0c;完了吧对应的事件忽略&#x…

面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....

前言 二月份的时候因为换工作的缘故&#xff0c;陆续参加了华为、蚂蚁、字节跳动、PDD、百度、Paypal 的社招面试&#xff0c;除了字节跳动流程较长&#xff0c;我主动结束面试以外&#xff0c;其他的都顺利拿到了 Offer。 最近时间稍微宽裕点了&#xff0c;写个面经&#xf…

1.测试用例

一、测试用例怎么写 用例编号&#xff0c;用例标题&#xff0c;模块/项目&#xff0c;前置条件&#xff0c;优先级&#xff0c;测试步骤&#xff0c;测试数据&#xff0c;预期结果&#xff0c;实际结果。 案例&#xff1a;微信登陆测试点 1.登录成功 2.密码错误&#xff0c;登…

安卓性能测试+结果可视化

使用到的技术&#xff1a;mobileperfpyecharts或mobileperfgrafana 性能测试 GitHub - alibaba/mobileperf: Android performance testAndroid performance test. Contribute to alibaba/mobileperf development by creating an account on GitHub.https://github.com/alibab…

Linux: ARM GIC仅中断CPU 0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI中断的CPU亲和性4.2.2 GIC初始化&#xff1a;缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5…

KT404C语音芯片串口发数据没反应或者报错的处理总结

一、问题简介 KT404C我焊接到PCB板上面&#xff0c;直接使用串口调试助手发指令没有任何返回&#xff0c;请问是什么意思呢&#xff1f; 很确定&#xff0c;串口也没连错&#xff0c;使用的是CH340G的USB转TTL &#xff0c;【TX连接KT404C的7脚RX】 【RX连接KT404C的8脚TX】 二…

Python常用标准库-os库一文详解(二):文件操作和路径操作

目录 前言 文件操作 一、读写文件 1.读文件 2.写文件 二、创建文件 三、删除文件 四、重命名文件 五、文件判断 路径操作 1.拼接 2. 分离路径 3.获取路径中的文件名 4.获取路径中的路径名 5.获取绝对路径 6.分离文件拓展名 点关注&#xff0c;防走丢&#xff…

CEC2020:能量谷优化算法(Energy valley optimizer,EVO)求解CEC2020(提供MATLAB代码)

一、能量谷优化算法 能量谷优化算法&#xff08;Energy valley optimizer&#xff0c;EVO&#xff09;是MahdiAzizi等人于2023年提出的一种新颖的元启发式算法&#xff0c;其灵感来自关于稳定性和不同粒子衰变模式的物理原理。 物理反应是指两个粒子或外部亚原子粒子碰撞产生新…

【matplotlib】可视化解决方案——如何向画布添加交叉直线

概述 在 matplotlib 中&#xff0c;如果想要在画布上添加一组横纵较差的直线&#xff0c;需要使用到 Cursor 类&#xff0c;该类实现了图形化界面中任何位置的数值定位可视化某种意义上来讲&#xff0c;这种横纵交叉线类似数值放大镜&#xff0c;可以清楚地显示任何位置的坐标…

以图搜图服务快速搭建

以图搜图服务快速搭建 电商公司&#xff0c;管理的商品少则几千&#xff0c;多则上百万。如何帮助用户从多如牛毛的商品中找到类似的商品就成了问题。 以图搜图就可以很好的帮助解决这个问题&#xff0c;通过 Towhee&#xff08;resnet50 模型&#xff09; Milvus 如何实现本…

Linux常用命令——lsusb命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) lsusb 显示本机的USB设备列表信息 补充说明 lsusb命令用于显示本机的USB设备列表&#xff0c;以及USB设备的详细信息。 lsusb命令是一个学习USB驱动开发&#xff0c;认识USB设备的助手&#xff0c;推荐大家使用…

深信服面经---云计算方向(附问题知识点解析)

深信服面经---云计算高级开发一、一面问题概览二、实操相关三、复盘对问题答案进行整理&#xff08;查漏补缺&#xff09;3.1、go语言简单了解3.2、项目中成就感最大或挑战最大的地方3.3、项目问题---协议头引入之后&#xff0c;包的大小增加了多少3.4、如何建立缓存3.5、cache…

STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…

“一键转换图片:学习如何使用Python调整大小、增强和转换图片!“

目录 简介&#xff1a; 源代码&#xff1a; 代码说明&#xff1a; 效果如图所示&#xff1a; 有关其中用到的Pillow模块&#xff1a; 简介&#xff1a; 在这个世界上&#xff0c;图片处理已经成为了必须掌握的技能之一&#xff0c;无论是为了更好地展示产品&#xff0c;还是…

C++ Primer Plus 第6版 读书笔记(4) 第4章 复合类型

目录 4.1 数组 4.2 字符串 4.3 string 类简介 4.3.4 string 类 I/O 4.4结构简介 4.5 共用体 4.6 枚举 4.7 指针和自由存储空间 4.8 指针、数组和指针算术 4.8.1 程序说明 4.8.2指针小结 4.8.5 自动存储、静态存储和动态存储 4.9 类型组合 4.10 数组的替代…

[算法与数据结构]--贪心算法初识

贪心算法贪心算法的解题过程贪心算法案例1.选择排序2. 平衡字符串3. 买卖股票的最佳时机 II4. 跳跃游戏5 钱币找零6 多机调度问题7.活动选择8. 最多可以参加的会议数目9. 无重叠区间来自算法导论对于这个贪心算法的解释定义贪心算法(又名贪婪算法)故名思意就是一个“贪心”的算…

小程序开发(一)新建/拉取项目,配置远程仓库

一、前期准备工作及工具 1、工具 微信开发者工具、Git 2、准备工作 相关开发工具的安装和配置工作请自行百度 二、新建或拉取远程项目 1、打开微信开发者工具(扫码登录等验证工作自行操作)&#xff0c;选择小程序。 2、点击号新建项目&#xff0c;项目名称、目录、模板选…

Git(狂神课堂笔记)

1.首先去git官网下载我们对应的版本Git - Downloading Package (git-scm.com) 2.安装后我们会发现git文件夹里有三个应用程序&#xff1a; Git Bash&#xff1a;Unix与Linux风格的命令行&#xff0c;使用最多&#xff0c;推荐最多 Git CMD&#xff1a;Windows风格的命令行 G…

kafka入门到实战三(单线程实现顺序消费,含demo)

这里需要前面两章的基础&#xff0c;如果没有环境或者看不懂在说什么&#xff0c;就翻一翻前两章。 kafka顺序消费&#xff08;单线程&#xff09; 顺序消费 顺序消费&#xff1a;是指消息的产生顺序和消费顺序相同。不管你用的是什么q或者kafka还是sofa&#xff0c;顺序依赖…