react-高阶组件

一、什么是高阶组件

高阶组件( Higher-Order Component,HOC )是一个以组件作为参数,返回一个新组件函数

  • 高阶组件最大的特点就是复用组件逻辑
  • 高阶组件本身并不是 React 的 API,而是React组件的一种设计模式,一种组件重用的高级技巧
  • 高阶组件是一个函数,接收要包装的组件,返回增强后的组件

二、如何实现一个高阶组件

高阶组件内部创建一个组件,在这个组件中提供复用的状态逻辑代码,通过props将复用状态传递给被包装组件 WrappedComponent

  • 创建一个函数,命名以 with 开头
  • 指定函数参数,参数为组件,所以参数应该以大写字母开头
  • 在函数内部创建一个组件,提供复用的状态逻辑代码,并返回
  • 在该组件中,渲染参数组件,同时将状态通过props传递给参数组件
  • 调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
function withMouse(WrappedComponent) {class Mouse extends React.Component {state = {x: 0,y: 0,}render() {return (<WrappedComponent {...this.state}></WrappedComponent>)}}return Mouse
}
const Position = props => (<div>鼠标位置: {props.x}, {props.y}</div>
)const MousePosition = withMouse(Position)<MousePosition />

三、高阶组件demo

  • 代码
import React from 'react'/*** 高阶组件*/// 获取组件名
// function getDisplayName(WrappedComponent) {
// 	return WrappedComponent.displayName || WrappedComponent.name || 'Component'
// }// 创建高阶组件
function withMouse(WrappedComponent) {// 该组件提供复用的状态逻辑class Mouse extends React.Component {// 初始化statestate = {x: 0,y: 0,}// 渲染UI,可以将state和props 一起传递给组件render() {return (<WrappedComponent {...this.state} {...this.props}></WrappedComponent>)}// 组件挂载,监听鼠标移动componentDidMount() {window.addEventListener('mousemove', this.handleMouseMove)}// 组件卸载,移除监听componentWillUnmount() {window.removeEventListener('mousemove', this.handleMouseMove)}// 鼠标移动事件处理程序handleMouseMove = e => {this.setState({x: e.clientX,y: e.clientY,})}}// 设置displayName  这个为了调试区分用,可以不设置// Mouse.displayName = `WithMouse${getDisplayName(WrappedComponent)}`// 返回增强后的组件return Mouse
}// 位置组件,用来测试高阶组件
const Position = props => (<div><h2>鼠标位置: {props.x}, {props.y}</h2>MousePosition组件: 接收的参数 a == {props.a}</div>
)// 猫抓老鼠组件,用来测试高阶组件
const Cat = props => (<div><imgsrc={require('../../assets/images/cat.png')}alt="猫"height="22px"style={{position: 'absolute',top: props.y - 10,left: props.x - 10,}}/>MouseCat组件: 接收的参数 a == {props.a}</div>
)// 获取增强后的组件
const MousePosition = withMouse(Position)
const MouseCat = withMouse(Cat)// 使用
class MouseHigher extends React.Component {// 渲染增强后的组件render() {return (<div><MousePosition a="111"></MousePosition><MouseCat a="222"></MouseCat></div>)}
}export default MouseHigher
  • 效果

在这里插入图片描述

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

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

相关文章

TVRNet网络PyTorch实现

文章目录 文章地址网络各层结构代码实现 文章地址 An End-to-End Traffic Visibility Regression Algorithm文章通过训练搜集得到的真实道路图像数据集&#xff08;Actual Road dense image Dataset, ARD&#xff09;&#xff0c;通过专业的能见度计和多人标注&#xff0c;获得…

javascript数据类型

目录 原始数据类型 引用数据类型 类型检测 类型转换 总结 原始数据类型 JavaScript 中有六种原始数据类型&#xff0c;它们是&#xff1a; Undefined&#xff08;未定义&#xff09;: 表示一个未被赋值的变量。Null&#xff08;空值&#xff09;: 表示一个空对象指针。B…

Qt 实现侧边栏滑出菜单效果

1.效果图 2.实现原理 这里做了两个widget&#xff0c;一个是 展示底图widget&#xff0c;一个是 展示动画widget。 这两个widget需要重合。动画widget需要设置属性叠加到底图widget上面&#xff0c;设置如下属性&#xff1a; setWindowFlags(Qt::FramelessWindowHint | Qt::…

【优选算法系列】第二节.双指针(202. 快乐数和11. 盛最多水的容器)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;优选算法系列 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff01…

基于java+springboot的人事招聘信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 项目介绍 开发过程…

锐捷EG易网关 phpinfo.view.php 信息泄露

致未经身份验证获取敏感信息 访问漏洞url&#xff1a; /tool/view/phpinfo.view.php漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何…

【强化学习】10 —— DQN算法

文章目录 深度强化学习价值和策略近似RL与DL结合产生的问题深度强化学习的分类 Q-learning回顾深度Q网络&#xff08;DQN&#xff09;经验回放优先经验回放 目标网络算法流程 代码实践CartPole环境代码结果 参考 深度强化学习 价值和策略近似 我们可以利用深度神经网络建立这些…

设计模式(19)命令模式

一、介绍&#xff1a; 1、定义&#xff1a;命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。 2、组…

Python深度学习实战-基于tensorflow原生代码搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 前面两篇文章分别介绍了两种搭建神经网络模型的方法&#xff0c;一种是基于tensorflow的keras框架&#xff0c;另一种是继承父类自定义class类&#xff0c;本篇文章将编写原生代码搭建BP神经网络。 实现代码 import tensorflow as tf from sklearn.datasets import…

哈希算法:如何防止数据库中的用户信息被脱库?

文章来源于极客时间前google工程师−王争专栏。 2011年CSDN“脱库”事件&#xff0c;CSDN网站被黑客攻击&#xff0c;超过600万用户的注册邮箱和密码明文被泄露&#xff0c;很多网友对CSDN明文保存用户密码行为产生了不满。如果你是CSDN的一名工程师&#xff0c;你会如何存储用…

debian 10 安装apache2 zabbix

nginx 可以略过&#xff0c;改为apache2 apt updateapt-get install nginx -ynginx -v nginx version: nginx/1.14.2mysql 安装参考linux debian10 安装mysql5.7_debian apt install mysql5.7-CSDN博客 Install and configure Zabbix for your platform a. Install Zabbix re…

SpringCore完整学习教程5,入门级别

本章从第6章开始 6. JSON Spring Boot提供了三个JSON映射库的集成: Gson Jackson JSON-B Jackson是首选的和默认的库。 6.1. Jackson 为Jackson提供了自动配置&#xff0c;Jackson是spring-boot-starter-json的一部分。当Jackson在类路径上时&#xff0c;将自动配置Obj…