react 进阶高阶组件 HOC

简介: 在了解高阶组件的时候,我们先来会议一下高阶函数,HOF(Higher-Order Function),这个的定义分为广义和侠义

含义


20210224155315355.png


高阶组件就是一个函数,且该函数接收一个组件作为参数,并返回一个新的组件。


定义就是这么说的,但是看完的肯定是似懂非懂。继续往下走


HOF (高阶函数)


在了解高阶组件的时候,我们先来会议一下高阶函数,HOF(Higher-Order Function),这个的定义分为广义和侠义:


  • 广义: 函数要是传入的参数中或者返回的结果都包含 函数 的函数;
  • 侠义: 函数的传入参数和返回结果都要包含函数的函数

具体的应用: 函数的柯里化,回调,防抖,节流等


举个例子:


下面有两个函数,一个是看电视,另一个是看电影。但是都要获取用户名。


function watchMove(){
// 相同逻辑...
  const name = localStorage.getItem('name');
  console.log(name + '看电影了'); 
}
function watchTV(){
// 相同逻辑...
  const name = localStorage.getItem('name');
  console.log(name + '看电视'); 
}
watchMove();
watchTV()


上面我们大概看一下是不是有重复的代码,重复获取用户名。我们怎么样能够少写这个代码呢?


解决方法


function watchMove(name:string){
  console.log(name + '看电影了');
}
function watchTV(name:string){
  console.log(name + '看电视');
}
/**
 * 行为的高阶函数
 * @param fn 
 */
function action(fn:(name:string)=> void){
  return function(){
    const getName =  localStorage.getItem('name') || '测试';
    // 调用函数
    fn(getName);
  }
}
action(watchMove)();
action(watchTV)();


结果


20210224164048838.png


我们都知道,react 中的组件可以是类组件和函数组件,本质上都函数组件,只是类组件比函数组件多了点生命周期。


HOC(Higher-Order Components)


使用react类组件来改写上面的代码


import React, { Component } from 'react'
/**
 * 状态接口
 */
interface IState {
  name: string 
}
/**
 * 看电视组件
 */
class WatchTV extends Component<{}, IState>{
  state = {
    name: ''
  }
  componentDidMount() {
    let name = localStorage.getItem('name') || '测试';
    this.setState(pre => ({
      name: name
    }))
  }
  render(){
    return (
      <div>
        {this.state.name} 看电视了
      </div>
    )
  }
}
/**
 * 看电影组件
 */
class WatchMovie extends Component<{}, IState>{
  state = {
    name: ''
  }
  componentDidMount() {
    let name = localStorage.getItem('name') || '测试';
    this.setState(pre => ({
      name: name
    }))
  }
  render(){
    return (
      <div>
        {this.state.name} 看电影了
      </div>
    )
  }
}


效果


20210224165647905.png


改造相同的部分


import React, { Component, ComponentType } from 'react'
/**
 * 状态接口
 */
interface IState {
  name: string
}
/**
 * 接口约定
 */
type IProp = {
  name: string
}
/**
 * hoc
 * @param Comp  ComponentType<IProp> 使用这个进行类型检查
 */
const Action = (Comp: ComponentType<IProp>) => {
  return class Action extends Component<{}, IState>{
    state = {
      name: ''
    }
    componentDidMount() {
      let name = localStorage.getItem('name') || '测试';
      this.setState(pre => ({
        name: name
      }))
    }
    render() {
      return <Comp name={this.state.name} />
    }
  }
}
/**
 * 看电视组件
 */
class WatchTV extends Component<IProp>{
  render() {
    return (
      <div>
        {this.props.name} 看电视了
      </div>
    )
  }
}
/**
 * 看电影组件
 */
class WatchMovie extends Component<IProp>{
  render() {
    return (
      <div>
        {this.props.name} 看电影了
      </div>
    )
  }
}
const AWatchTv = Action(WatchTV);
const AWatchMovie = Action(WatchMovie);


结果


20210224173328572.png


注意:


1.不要在render中使用高阶组件,会递归无限循环


2.不要在高阶组件内部更改传入的组件,不符合单一原则


3.在ts 中的高阶组件中,类型需要使用 ComponentType<IProp> 使用这个进行类型检查,这样才不会丢失类型检查


4.高阶组件属于 装饰者 模式,可以利用HOC实现横切关注点, AOP

相关文章
|
1月前
|
前端开发 API
react怎么实现父子组件传值?
react怎么实现父子组件传值?
10 1
|
12天前
|
缓存 前端开发 JavaScript
【亮剑】在React中如何通过点击事件控制组件显示与隐藏,包括基础概念和高级应用
【4月更文挑战第30天】本文介绍了在React中如何通过点击事件控制组件显示与隐藏,包括基础概念和高级应用。使用`useState`钩子和Context API可实现状态驱动的条件渲染,通过CSS类控制组件样式,或利用React Portals在DOM不同位置渲染。性能优化应注意避免不必要的渲染、合理使用Keys、优化事件处理器、使用Memoization及清理资源。测试和验证确保逻辑正确性,以构建动态用户界面并提升应用性能。
|
17天前
|
前端开发 JavaScript 开发者
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(二)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
22 0
|
17天前
|
JavaScript 前端开发 算法
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(一)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
17 0
|
17天前
|
存储 前端开发 JavaScript
React的表单处理:受控组件与非受控组件深入解析
【4月更文挑战第25天】React表单处理涉及受控和非受控组件。受控组件通过状态管理表单数据,每次用户输入都触发状态更新,确保数据同步,适合实时交互但可能影响性能。非受控组件不直接管理状态,数据存储在DOM中,简化代码,适用于更新不频繁的场景,但在数据验证和同步上存在挑战。开发者应根据需求灵活选择。
|
17天前
|
前端开发 JavaScript 开发者
React的函数组件与类组件:探索两者之间的区别
【4月更文挑战第25天】React提供函数组件和类组件,两者在语法、状态管理、生命周期和性能优化上有所不同。函数组件简单且易于理解,使用 Hooks 可添加状态管理;类组件支持复杂状态管理和生命周期方法,适用于需要精细控制更新的场景。随着 Hooks 的发展,函数组件功能增强,成为更多开发者的首选。选择组件类型应根据实际需求权衡。
|
17天前
|
设计模式 前端开发 API
React的高阶组件(HOC):使用与设计模式探讨
【4月更文挑战第25天】React的高阶组件(HOC)是一种复用和增强组件的高级模式,它接受组件并返回新组件。非侵入式增强使得HOC能在不修改原有组件代码的情况下添加功能。定义HOC后,将其应用于目标组件并渲染增强后的组件。常见设计模式包括属性代理、控制反转和装饰器。然而,使用时要注意避免滥用,保持命名清晰,关注性能优化。理解并恰当使用HOC能提升React应用的构建效率。
|
18天前
|
前端开发
探索React Hooks:一种全新的组件逻辑管理方式
React Hooks是React 16.8版本引入的一项新功能,它改变了我们编写React组件的方式。本文将从Hooks的起源讲起,逐步分析Hooks的优势,并通过具体示例展示Hooks在组件逻辑管理中的应用,旨在帮助读者更好地理解和运用React Hooks。
|
1月前
|
前端开发
React组件通信:如何优雅地实现组件间的数据传递
React组件通信:如何优雅地实现组件间的数据传递
21 0
|
3月前
|
前端开发 中间件 数据安全/隐私保护
React路由进阶方法
React路由进阶方法
28 1