react高阶组件和hooks

本文详细介绍了React中的高阶组件(HOC)的概念、使用场景、实现方式及渲染劫持,包括属性代理和反向继承两种实现方法。同时,讲解了Hooks的基本概念、用途,如何在函数式组件中使用useState和useEffect来模拟状态管理和生命周期。最后,讨论了在React Router 6.0中如何封装自定义的withRouter高阶组件。
摘要由CSDN通过智能技术生成

1. react高阶组件

1.1 高阶组件的概念

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

概述:高阶组件是一个函数,而不是组件,但其参数和返回值都是组件

1.2 高阶组件的使用场景

1.2.1 需要代码重用时

react如果有多个组件都用到同一端逻辑,这是就可以把共同的逻辑部分提取出来,利用高阶组件的形式将这段逻辑整合到每一个组件中,从而减少代码的逻辑重复。

1.2.2 需要组件增强优化时

比如我们在项目中使用的组件有些不是自己写的,而是从网上撸下来的,但是第三方写的组件可能比较复杂,有时不能完全满足需求,且第三方组件不易修改,此时也可以用高阶组件。在不修改原始组件的前提下,对组件添加满足实际开发需求的功能。

一般来说,高阶组件在的父组件,会对原始组件模板做增强优化

return (
    <div>
      <nav><h3>这是高阶组件增加的导航栏</h3></nav>
      <OldCom/>
    </div>
  )

1.3 高阶组件的实现方式

1.3.1 属性代理

流程:通过创建新组件来包裹原始组件,把原始组件作为新组件的子组件渲染

功能:可实现对原始组件的 props数据更新组件模板更新

示例代码如下:

import React, { Component } from 'react'
function myHoc(OldCom){
  return class NewCom extends Component {
    constructor(props){
      super(props);
      console.log(props);  // 路由信息会传入高阶组件的props中,可以对它进行增删改
    }
    render() {
       return (
// 如果返回一个新模板,相当于把原始组件直接替换了,这就是渲染劫持
          return <div><h1>这是订单页的高阶组件</h1></div>

// 如果要返回原始组件模板,把原始组件作为子组件返回即可
          // return <OldCom/>
      )
    }
  }
}
export default myHoc  // 导出高阶组件这个函数

注意:在构造器中路由信息会传入高阶组件的props中,可以对它进行增删改

由于props是只读的,不能修改,要对其进行深复制,然后再进行修改

有两种深复制方式如下:

// this.tempProps = JSON.parse(JSON.stringify(props))
  • 第一种深复制会丢失函数,因为JSON里面不识别函数,所以不能放函数
this.tempProps = {...props}
  • 第二种深复制不会丢失函数,但只能深复制第一层。

此处使用第二种方式,对props进行增删改操作:

this.tempProps.name = "张三"
console.log(this.tempProps);
delete this.tempProps.match  // ES5 删除属性 
var { location, ...tempObj} = this.tempProps  // ES6 解构删除
this.tempProps = tempObj
console.log(this.tempProps);
this.tempProps.history.action = "PUSH"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值