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

相关文章
|
11天前
|
前端开发 UED 开发者
React 悬浮按钮组件 FloatingActionButton
悬浮按钮(FAB)是常见的UI元素,用于提供突出的操作。本文介绍如何在React中使用Material-UI创建美观的FAB组件,涵盖基本概念、实现方法及常见问题解决。通过代码示例和优化技巧,帮助开发者提升用户体验,确保按钮位置、颜色、交互反馈等方面的表现,同时避免无障碍性和性能问题。
109 80
|
19天前
|
前端开发 JavaScript 开发者
React 按钮组件 Button
本文介绍了 React 中按钮组件的基础概念,包括基本的 `&lt;button&gt;` 元素和自定义组件。详细探讨了事件处理、参数传递、状态管理、样式设置和可访问性优化等常见问题及其解决方案,并提供了代码示例。帮助开发者避免易错点,提升按钮组件的使用体验。
154 77
|
16天前
|
存储 前端开发 UED
React 面包屑组件 Breadcrumb 详解
面包屑导航是现代Web应用中常见的UI元素,帮助用户了解当前位置并快速返回上级页面。本文介绍如何使用React构建面包屑组件,涵盖基本概念、实现方法及常见问题。通过函数式组件和钩子,结合React Router动态生成路径,处理嵌套路由,并确保可访问性。示例代码展示了静态和动态面包屑的实现,帮助开发者提升用户体验。
120 73
|
20天前
|
前端开发 UED 开发者
React 对话框组件 Dialog
本文详细介绍了如何在 React 中实现一个功能完备的对话框组件(Dialog),包括基本用法、常见问题及其解决方案,并通过代码案例进行说明。从安装依赖到创建组件、添加样式,再到解决关闭按钮失效、背景点击无效、键盘导航等问题,最后还介绍了如何添加动画效果和处理异步关闭操作。希望本文能帮助你在实际开发中更高效地使用 React 对话框组件。
126 75
|
25天前
|
前端开发 Java API
React 进度条组件 ProgressBar 详解
本文介绍了如何在 React 中创建进度条组件,从基础实现到常见问题及解决方案,包括动态更新、状态管理、性能优化、高级动画效果和响应式设计等方面,帮助开发者构建高效且用户体验良好的进度条。
46 18
|
2月前
|
存储 前端开发 测试技术
React组件的最佳实践
React组件的最佳实践
|
2月前
|
前端开发 API 开发者
React 文件上传组件 File Upload
本文详细介绍了如何在 React 中实现文件上传组件,从基础的文件选择和上传到服务器,再到解决文件大小、类型限制、并发上传等问题,以及实现多文件上传、断点续传和文件预览等高级功能,帮助开发者高效构建可靠的应用。
68 12
|
1月前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
43 4
|
2月前
|
前端开发 JavaScript API
React 文件下载组件 File Download
本文介绍了在React中实现文件下载组件的方法,包括使用`a`标签和JavaScript动态生成文件,解决了文件路径、文件类型、大文件下载及文件名乱码等问题,并展示了使用第三方库`file-saver`和生成CSV文件的高级用法。
40 6
|
1月前
|
前端开发 JavaScript API
React 文件下载组件:File Download
本文详细介绍了如何在React应用中实现文件下载组件,包括基本概念、实现步骤和代码示例。同时,探讨了常见问题如文件类型不匹配、文件名乱码等及其解决方法,旨在提升用户体验和代码可维护性。
70 2