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

相关文章
|
18天前
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
53 0
|
22天前
|
移动开发 前端开发 API
React 拖拽组件 Drag & Drop
本文介绍了在 React 中实现拖拽功能的方法,包括使用原生 HTML5 Drag and Drop API 和第三方库 `react-dnd`。通过代码示例详细讲解了基本的拖拽实现、常见问题及易错点,帮助开发者更好地理解和应用拖拽功能。
55 9
|
17天前
|
前端开发 UED 开发者
React 分页组件 Pagination
本文介绍了如何在 React 中实现分页组件,从基础概念到常见问题及解决方案。分页组件用于将大量数据分成多个页面,提升用户体验。文章详细讲解了分页组件的基本结构、快速入门步骤、以及如何处理页面跳转不平滑、页码过多导致布局混乱、边界条件处理和数据加载延迟等问题。通过本文,读者可以全面了解并掌握 React 分页组件的开发技巧。
28 2
|
21天前
|
设计模式 前端开发 编译器
与普通组件相比,React 泛型组件有哪些优势?
与普通组件相比,React 泛型组件有哪些优势?
32 6
|
29天前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
37 2
|
2月前
|
前端开发 JavaScript 测试技术
React 高阶组件 (HOC) 应用
【10月更文挑战第16天】高阶组件(HOC)是 React 中一种复用组件逻辑的方式,通过接受一个组件并返回新组件来实现。本文介绍了 HOC 的基础概念、核心功能和常见问题,包括静态方法丢失、ref 丢失、多个 HOC 组合和 props 冲突的解决方案,并提供了具体的 React 代码示例。通过本文,读者可以更好地理解和应用 HOC,提高代码的复用性和可维护性。
64 8
|
2月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
23天前
|
前端开发 UED
React 模态框 Modal 组件详解
【10月更文挑战第27天】本文介绍了如何在 React 中实现一个功能完善的模态框组件。从基础概念入手,逐步讲解了简单的模态框实现、CSS 样式、传递子组件、键盘事件处理等高级功能。同时,还探讨了常见问题及易错点,如背景点击关闭、键盘事件冲突和动画效果。通过本文,读者可以全面了解 React 模态框组件的实现细节。
44 0
|
2月前
|
前端开发 JavaScript 调度
React 组件状态(State)
10月更文挑战第8天
33 1
|
2月前
|
前端开发 JavaScript API
React将组件作为属性传递的最佳实践
本文探讨了在React中将组件作为属性传递的三种常见方式:作为元素传递、作为组件传递、作为函数传递。通过构建带图标的按钮组件,对比分析了每种方式的优缺点,最终推荐将组件作为函数传递,因为它提供了更好的可控性、灵活性和可扩展性。
43 0