【前端知识】React 基础巩固(二十五)——高阶组件

React 基础巩固(二十五)——高阶组件

高阶函数

  • 定义:接收一个或多个函数作为输入输出一个函数 的函数
  • JS 中常用的mapfilterreduce都是高阶函数

高阶组件(Higher-Order Components, HOC)

  • 定义:高阶组件是参数为函数,返回值为新组件的函数
  • 高阶组件本质是函数
  • 高阶组件并不是 React API 的一部分,它是基于 React 的组合特性而形成的设计模式
import React, { PureComponent } from "react";// 定义一个高阶组件
function hoc(Cpn) {// 1.定义一个类组件class NewCpn1 extends PureComponent {render() {return <Cpn />;}}return NewCpn1;// 2.定义一个函数组件function NewCpn2(props) {}return NewCpn2;
}class HelloWorld extends PureComponent {render() {return (<div><h1>hello world</h1></div>);}
}const HelloWorldHOC = hoc(HelloWorld);export class App extends PureComponent {render() {return (<div><HelloWorld /><HelloWorldHOC /></div>);}
}export default App;

高阶组件的应用场景(一)—— 用户信息增强

  • 构建用户信息增强高阶组件
import React, { PureComponent } from "react";
// 定义组件: 给一些需要特殊数据的组件注入props
function enhanceUserInfo(OriginCmp) {class NewComponent extends PureComponent {constructor() {super();this.state = {userInfo: {name: "outman",level: 123,},};}render() {return <OriginCmp {...this.props} {...this.state.userInfo} />;}}return NewComponent;
}export default enhanceUserInfo;
  • 使用高阶组件拦截组件并注入用户信息
import React, { PureComponent } from "react";
import enhanceUserInfo from "./enhance_props";const Home = enhanceUserInfo(function Home(props) {return (<h1>Home: {props.name} - {props.level} - {props.age}</h1>);
});const Profile = enhanceUserInfo(function Profile(props) {return (<h1>Profile: {props.name} - {props.level}</h1>);
});const Hello = enhanceUserInfo(function Hello(props) {return (<h1>Hello: {props.name} - {props.level}</h1>);
});export class App extends PureComponent {render() {return (<div><Home age={"888"} /><Profile /><Hello /></div>);}
}export default App;

高阶组件的应用场景(二)—— 拦截并处理Context传参

  • 构建 ThemeContext
import { createContext } from "react";const ThemeContext = createContext();export default ThemeContext;
  • 构建 App.jsx,通过 ThemeContext.Provider 传递参数给<Product/>
import React, { PureComponent } from "react";
import ThemeContext from "./context/theme_context";
import Product from "./Product";export class App extends PureComponent {render() {return (<div><ThemeContext.Provider value={{ color: "red", size: 18 }}><Product /></ThemeContext.Provider></div>);}
}export default App;
  • 构建 Product.jsx, 在 Product 中,通过 ThemeContext.Consumer 消费参数
import React, { PureComponent } from "react";
import ThemeContext from "./context/theme_context";// 直接使用上下文方式传递props参数
export class Product extends PureComponent {render() {return (<div>Product:<ThemeContext.Consumer>{(value) => {return (<h2>theme: {value.color} - {value.size}</h2>);}}</ThemeContext.Consumer></div>);}
}export default Product;
  • 若每次都要采用上述方式,通过ThemeContext.Consumer消费参数,太过繁琐。故,可以利用高阶组件进行处理。
  • 构建高阶组件 with_theme
import ThemeContext from "./theme_context";function withTheme(OriginComponent) {return (props) => {return (<ThemeContext.Consumer>{(value) => {return <OriginComponent {...value} {...props} />;}}</ThemeContext.Consumer>);};
}export default withTheme;
  • 通过withTheme包装Product
import React, { PureComponent } from "react";
import withTheme from "./context/with_theme";// 利用高阶函数方式,更简洁
export class Product extends PureComponent {render() {const { color, size } = this.props;return (<div>Product:{color} - {size}</div>);}
}export default withTheme(Product);

高阶组件的应用场景(三)—— 登陆鉴权

  • 构建登陆鉴权高阶组件
function loginAuth(OriginComponent) {return (props) => {// 从localStorage 中获取 tokenconst token = localStorage.getItem("token");if (token) {return <OriginComponent {...props} />;} else {return <h2>请先登陆</h2>;}};
}export default loginAuth;
  • 构建 APP.jsx
import React, { PureComponent } from "react";
import Cart from "./Cart";export class App extends PureComponent {constructor() {super();this.state = {isLogin: false,};}loginClick() {localStorage.setItem("token", "test token value");this.setState({isLogin: true,});}render() {const { isLogin } = this.state;return (<div><button onClick={(e) => this.loginClick()}>登录</button><Cart /></div>);}
}export default App;
  • 构建Cart.jsx,并用loginAuth包裹Cart进行鉴权处理
import React, { PureComponent } from "react";
import loginAuth from "./login_auth";export class Cart extends PureComponent {render() {return (<div><h2>Cart</h2></div>);}
}export default loginAuth(Cart);

高阶组件的应用场景(四)—— 打印界面渲染时间

  • 构建打印界面渲染时间高阶组件
import { PureComponent } from "react";function logRenderTime(OriginComponent) {return class extends PureComponent {UNSAFE_componentWillMount() {this.beginTime = new Date().getTime();}componentDidMount() {this.endTime = new Date().getTime();const interval = this.endTime - this.beginTime;console.log(`当前页面:${OriginComponent.name} 的渲染花费:${interval} ms`);}render() {return <OriginComponent />;}};
}export default logRenderTime
  • 构建App.jsx
import React, { PureComponent } from 'react'
import Detail from './Detail'export class App extends PureComponent {render() {return (<div><Detail></Detail></div>)}
}export default App
  • 构建Detail.jsx,并通过logRenderTime拦截Detail组件,打印其界面渲染时间
import React, { PureComponent } from "react";
import logRenderTime from "./log_render_time";export class Detail extends PureComponent {render() {return (<div><h2>Detail Page</h2><ul><li>数据列表1</li><li>数据列表2</li><li>数据列表3</li><li>数据列表4</li><li>数据列表5</li><li>数据列表6</li><li>数据列表7</li><li>数据列表8</li><li>数据列表9</li><li>数据列表10</li></ul></div>);}
}export default logRenderTime(Detail);

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

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

相关文章

数字 IC 设计职位经典笔/面试题(二)

共100道经典笔试、面试题目&#xff08;文末可全领&#xff09; FPGA 中可以综合实现为 RAM/ROM/CAM 的三种资源及其注意事项&#xff1f; 三种资源&#xff1a;BLOCK RAM&#xff0c;触发器&#xff08;FF&#xff09;&#xff0c;查找表&#xff08;LUT&#xff09;&#xf…

ROS:pluginlib

目录 一、前言二、概念三、作用四实际用例4.1需求4.2流程4.3准备4.4创建基类4.5创建插件4.6注册插件4.7构建插件库4.8使插件可用于ROS工具链4.8.1配置xml4.8.2导出插件 4.9使用插件4.10执行 一、前言 pluginlib直译是插件库&#xff0c;所谓插件字面意思就是可插拔的组件&…

河北幸福消费金融基于 Apache Doris 构建实时数仓,查询提速 400 倍!

本文导读&#xff1a; 随着河北幸福消费金融的客户数量和放贷金额持续上升&#xff0c;如何依托大数据、数据分析等技术来提供更好决策支持、提高工作效率和用户体验&#xff0c;成为了当前亟需解决的问题。基于此&#xff0c;公司决定搭建数据中台&#xff0c;从基于 TDH 的离…

Windows 如何锁定文件

一、背景 如果应用程序有操作本地文件的功能&#xff08;如&#xff1a;读、写、复制、移动、删除等等&#xff09;&#xff0c;那么在测试或调试该应用程序时&#xff0c;肯定需要测试文件被其他应用程序锁定时&#xff0c;你的应用程序是如何处理的。 那么如何在本地模拟文件…

Ceph(分布式文件系统)

Ceph(分布式文件系统) 1、存储基础 单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 ●NAS&#xf…

缓存滚动位置:解决keep-alive组件缓存滚动位置失败问题

怎样在vue中缓存组件&#xff1f;大家都知道&#xff0c;使用keep-alive组件即可&#xff0c;但是使用keep-alive缓存页面后&#xff0c;发现虽然页面缓存成功了&#xff0c;但是列表的滚动条又自动回到了最上方。 是的&#xff0c;keep-alive组件是不会缓存滚动位置的。 怎样…

基于springboot的地铁轨道交通运营系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【网站搭建】3 更换博客主题—butterfly

可以到官网选择想要更换的主题Themes | Hexo 我选用的是butterflyzhangzeli/hexo-theme-butterfly: A Hexo Theme: Butterfly (github.com) 在Hexo根目录打开终端执行拉去操作 下载配套文件 npm install hexo-renderer-pug hexo-renderer-stylus 打开_config.yml文件&#xf…

TCP实现FTP功能

目录 server client makefile 运行顺序 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上传输文件的标准协议。 它允许用户通过网络将文件从一个计算机&#xff08;称为FTP服务器&#xff09;传输到另一个计算机&#xff08;称为FTP客户端&…

配置右键点击文件夹通过IDEA打开项目

0、 前言 你是不是每次打开idea项目时&#xff0c;都需要走一遍这样的流程&#xff1a; 1、先启动idea 2、然后手动选择项目路径 3、打开项目 于是在打开项目的路上就耗费了大量的时间。 这篇文章会教你通过配置&#xff0c;让项目可以直接通过右键打开&#xff0c;大大提升项…

XR应用云流化,多方面提升 XR 扩展现实体验!

无论是使用户能够协作设计电动赛车&#xff0c;还是帮助观众通过数字世界与自然互动&#xff0c;越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境。 下一代沉浸式技术的应用越来越广泛&#xff0c;图形和人工智能的最新突破正在扩展XR的功能。这四种技术正在XR生态…

uniapp中refs获取打印是空对象{}的解决办法

场景复现 版本如下: "dcloudio/uni-app": "2.0.2-3080720230703001", "vue": "> 2.6.14 < 2.7", 开发中发现只要是view这些原始标签的ref都无法在任何地方获取到refs.xxx, 而组件标签如<myStep></myStep> 这种加ref…

rust声明式宏

宏 在 rust 中&#xff0c;我们一开始就在使用宏&#xff0c;例如 println!, vec!, assert_eq! 等。看起来宏和函数在使用时只是多了一个 !。实际上这些宏都是声明式宏&#xff08;也叫示例宏或macro_rules!&#xff09;&#xff0c;rust 还支持过程宏&#xff0c;过程宏为我们…

【java】【基础1】数据类型运算符

目录 一、数据类型&#xff08;4大类8种&#xff09; 1.1类型转换 1、自动类型转换 2、表达式的自动类转换 3、强制类型转换 二、运算符 2.1基本算术运算符 2.2自增自减运算符 2.3赋值运算 2.4关系运算符 2.5逻辑运算符 2.6三元运算符 2.7运算符的优先级 三、API文档&am…

ffmpeg相关API(2)

av_find_input_format() /*** 根据输入格式的短名称查找AVInputFormat。 */ ff_const59 AVInputFormat *av_find_input_format(const char *short_name); avformat_open_input() /*** 打开一个输入流并读取头。编解码器未打开。 * 必须使用avformat_close_input&#xff0…

学习记录——SAM、SPM

Segment Anything Model&#xff08;SAM&#xff09; 能分割一切的模型 2023 SAM是一个提示型模型&#xff0c;其在1100万张图像上训练了超过10亿个掩码&#xff0c;实现了强大的零样本泛化。许多研究人员认为「这是 CV 的 GPT-3 时刻&#xff0c;因为 SAM 已经学会了物体是什…

ffmpeg 采集音频数据

音视频数据采集的步骤&#xff1a; 设备注册设置对应的采集方式&#xff0c;avfoundation、dshow、alas打开设备 具体的例子: #include <stdio.h> extern "C"{#include <libavutil/avutil.h>#include <libavdevice/avdevice.h>#include <lib…

世界上很少人知道的网站

1.此人不存在 点击此处打开 2.彩虹屁生成器(夸夸神器&#xff09; 点击此处打开 3.小鸡词典 点击此处打开 4.SHADIAO图片动起来 点击此处打开 5.中午吃什么网 点击此处打开 6.广告门 点击此处打开 嘘&#xff01;这是一个秘密&#xff0c;我只告诉你&#xff0c;别告诉其…

高级教程之ui运行神器

windows chocolatey官网&#xff1a;https://chocolatey.org/ powershell管理员权限下运行: Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex…

F#奇妙游(14):F#实现WPF的绑定

WPF中的绑定 绑定在UI开发中是一个非常重要的概念&#xff0c;它可以让我们的UI界面和数据模型之间建立起联系&#xff0c;当数据模型发生变化时&#xff0c;UI界面也会随之变化&#xff0c;反之亦然。这样的好处是显而易见的&#xff0c;我们不需要手动去更新UI界面&#xff…