今天学习了react高阶组件,刚接触react学习起来还是比较困难,和大家分享一下今天学习的知识吧,另外缺少的地方欢迎补充哈哈

高阶组件(Higher Order Components,简称:HOC)

是 React 中用于重用组件逻辑的高级技术, 它本身不是react中的组件, 而是一个函数,
 这个函数接受一个react组件作为参数,并返回一个新组件, 实现了对原有组件的增强和优化, 
可以对原有组件中的state, props和逻辑执行增删改操作, 一般用于代码重用和组件增强优化。

高阶组件的使用场景

1, 需要代码重用时, react如果有多个组件都用到了同一段逻辑, 这时,就可以把共同的逻辑部分提取出来,
利用高阶组件的形式将这段逻辑整合到每一个组件中, 从而减少代码的逻辑重复。
2, 需要组件增强优化时, 比如我们在项目中使用的组件有些不是自己写的, 而是从网上C下来的, 
但是第三方写的组件可能比较复杂, 有时不能完全满足需求, 但第三方组件不易修改, 此时也可以用高阶组件,
在不修改原始组件的前提下, 对组件添加满足实际开发需求的功能。
 

高阶组件的实现方式

高阶组件的实现方式有两种:

1, 属性代理: 通过创建新组建来包裹原始组件, 把原始组件作为新组建的子组件渲染  
   功能: 可实现对原始组件的 props数据更新 和 组件模板更新。
  下面是实现属性代理的代码片段:
  (1), 新建高阶组件文件 MyHOC.jsx
  (2), 在文件中创建函数 函数的参数是一个组件OldCom(参数可以自定义), 函数的返回值也是一个组件 NewCom(自定义)
  

function MyHoc(OldCom){
return class NewCom extends React.Component{
render(){
let newProps = { age: 10, sex: '男' }
return (
<OldCom {...newProps} ></OldCom>
)
}
}
} // 导出高阶组件函数
export default MyHOC; // 属性代理: 通过创建新组建来包裹原始组件, 把原始组件作为新组建的子组件渲染
// 功能: 可实现对原始组件的 props数据更新 和 组件模板更新
 
2, 反向继承: 通过创建新组建继承自原始组件, 把原始组件作为父组件 
  功能: 可实现对原始组件的state状态数据更新 和 组件模板更新。
  下面是实现反向继承的代码片段:
  

 1 function MyHOC (OldCom){
2 return class NewCom extends OldCom{
3 componentDidMount() {
4 this.setState({ name: '李四' })
5 }
6 render() {
7 return super.render()
8 }
9 }
10 }
11
12 // 导出高阶组件函数
13 export default MyHOC;
14
15 // 反向继承的state数据, 不能在render中改, 会进入死循环
16 // 一般在生命周期函数或自定义函数中更新state
 

高阶组件的渲染劫持

通过高阶组件可以把原始组件的模板进行修改和替换
渲染劫持指对一个组件渲染内容的装饰或修改, 一般通过高阶组件来实现, 
把一个组件传入高阶组件, 可以对这个组件的模板进行修改后执行渲染, 
也可以阻止组件渲染,并修改组件中的数据和逻辑。
下面是渲染劫持的代码片段
 1 function MyHOC (OldCom){
2 return class NewCom extends OldCom{
3 componentDidMount() {
4 this.setState({ name: '李四' })
5 }
6 render() {
7 // 以下模拟订单页渲染, 从状态管理中取出登录状态, 加以判断
8 let isLogin = true;
9 if(isLogin){
10
11 // 此时,要渲染父组件,就要用父组件对象super渲染
12 return super.render()
13 }else{
14 this.props.history.push("/login")
15 return null
16 }
17 }
18 }
19 }
20 export default MyHOC
 
 

渲染劫持的应用

 一般用于一些需要登录状态的页面, 在路由请求渲染页面(如订单页)之前, 
使用高阶组件判断是否已登录,如果已登录,返回订单页模板, 如果没有登录,返回空,并跳转到登录页
 
 

最后在使用用高阶组件的时候,别忘了导入组件,

路径改成你文件路径导入:

import 自定义名称 from "高阶组件所在路径"
 
 
 
 
 

是发

react高阶组件的一些运用的更多相关文章

  1. 聊聊React高阶组件(Higher-Order Components)

    使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...

  2. 当初要是看了这篇,React高阶组件早会了

    当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...

  3. react高阶组件的理解

    [高阶组件和函数式编程] function hello() { console.log('hello jason'); } function WrapperHello(fn) { return fun ...

  4. 函数式编程与React高阶组件

    相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...

  5. React高阶组件学习笔记

    高阶函数的基本概念: 函数可以作为参数被传递,函数可以作为函数值输出. 高阶组件基本概念: 高阶组件就说接受一个组件作为参数,并返回一个新组件的函数. 为什么需要高阶组件 多个组件都需要某个相同的功能 ...

  6. 利用 React 高阶组件实现一个面包屑导航

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理完成后的 React 组件.React 高阶组件在 React 生态中使用的非常频繁, ...

  7. React——高阶组件

    1.在React中higher-order component (HOC)是一种重用组件逻辑的高级技术.HOC不是React API中的一部分.HOC是一个函数,该函数接收一个组件并且返回一个新组件. ...

  8. react 高阶组件的 理解和应用

    高阶组件是什么东西 简单的理解是:一个包装了另一个基础组件的组件.(相对高阶组件来说,我习惯把被包装的组件称为基础组件) 注意:这里说的是包装,可以理解成包裹和组装: 具体的是高阶组件的两种形式吧: ...

  9. react高阶组件的使用

    为了提高代码的复用在react中我们可以使用高阶组件 1.添加高阶组件 高阶组件主要代码模板HOC.js export default (WrappedComponent) => { retur ...

随机推荐

  1. 虚拟环境及venv和virtualenv

    一.虚拟环境概述 Python应用程序通常会使用不在标准库内的软件包和模块.应用程序有时需要特定版本的库,修复特定的错误,或者可以使用库的过时版本的接口编写应用程序. 这说明一个Python安装可能无 ...

  2. Linux__用户用户组和权限

    用户用户组和权限 useradd +用户名, 添加这个用户 userdel +用户名, 删除这个用户(有残留 ) userdel -r +用户名, 彻底删除这个用户 groupadd +组名 ,添加这 ...

  3. Lagrange插值C++程序

    输入:插值节点数组.插值节点处的函数值数组,待求点 输出:函数值 代码如下:把printf的注释取消掉,能打印出中间计算过程,包括Lagrange多项式的求解,多项式每一项等等(代码多次修改,这些pr ...

  4. Docker 实战(2)- 配置 Jenkins 容器上的持续集成环境

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 搭建 Jenkins 容器 就是 ...

  5. Spark架构与原理这一篇就够了

    一.基本介绍 是什么? 快速,通用,可扩展的分布式计算引擎. 弹性分布式数据集RDD RDD(Resilient Distributed Dataset)弹性分布式数据集,是Spark中最基本的数据( ...

  6. 打包项目成war包并部署到服务器上,项目运行一直显示加载中

    查看服务器上的Tomcat路径下的log 显示 org.apache.catalina.LifecycleException: Failed to initialize component [Conn ...

  7. 生活tips_织毛衣

    生梨润肺化痰好,苹果止泻营养高. 黄瓜减肥有成效,抑制癌症猕猴桃. 番茄补血助容颜,莲藕除烦解酒妙. 橘子理气好化痰,韭菜补肾暖膝腰. 萝卜消食除胀气,芹菜能治血压高. 白菜利尿排毒素,菜花常吃癌症少 ...

  8. JS缓冲运动案例:右侧居中悬浮窗

    JS缓冲运动案例:右侧居中悬浮窗 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta cha ...

  9. Vue3.0响应式原理

    Vue3.0的响应式基于Proxy实现.具体代码如下: 1 let targetMap = new WeakMap() 2 let effectStack = [] //存储副作用 3 4 const ...

  10. linux全局和个人配置文件说明

    1.bash配置文件: 1).全局(bash的配置文件) 有 /etc/profile   /etc/profile.d/*  与 /etc/bashrc 其实都是bash这个程序启动的时候会读取配置 ...