浅谈react 高阶组件

简介: 1.高阶组件是 react组件总结中最难的一种,平常基本用不到,就算能用到也给规避了,所以也导致很多人不会2.这几天结合之前的一些粗浅经验,搞了个简单的梳理,最终梳理出几个相对简单易懂的课件,不足之处,欢迎交流

1. 前言


1.高阶组件是 react组件总结中最难的一种,平常基本用不到,就算能用到也给规避了,所以也导致很多人不会

2.这几天结合之前的一些粗浅经验,搞了个简单的梳理,最终梳理出几个相对简单易懂的课件,不足之处,欢迎交流


2. 是什么 what


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

1.是 React 中用于重用组件逻辑的高级技巧.

2.HOC 自身不是 React API的一部分,它是一种基于 React 的组合特性而形成的设计模式

3.高阶组件参数为组件,返回值为新组件的函数

简单理解

一个高阶组件只是一个包装了另外一个 React 组件的  组件。

这种形式通常实现为一个函数,本质上是一个类工厂(class factory


3.优点


1.实现了对原有组件的增强和优化,

2.可以对原有组件中的state, props和逻辑执行增删改操作, 一般用于代码重用和组件增强优化


4. 应用场景


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


5. 组件和 高阶组件的区别


1.组件是将 props 转换为 UI

2.高阶组件是将组件转换为另一个组件


6. 实现方式


6.1 属性代理

(Props Proxy): 通过创建新组件来包裹原始组件, 把原始组件作为新组件的子组件渲染

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

6.2 反向继承

(Inheritance Inversion): 通过创建新组件继承自原始组件, 把原始组件作为父组件

功能: 可实现对原始组件的state状态数据更新 和 组件模板更新

好了已经一大堆理论了,上代码 再接着理论


7. 铺垫 引出工作/代码


7.1 代码


localStorage.setItem("userInfo", JSON.stringify({ name: "yzs", description: "生活如此多娇" }))
        class UserView extends React.Component {
            constructor(props) {
                super(props)
                this.state = { userInfo: {} }
            }
            componentDidMount() {
                let userInfo = JSON.parse(localStorage.getItem("userInfo"))
                this.setState({ userInfo })
            }
            render() {
                let { userInfo } = this.state
                return (
                    <div>
                        <h1>{userInfo.name}</h1>
                        <p>{userInfo.description}</p>
                    </div>
                )
            }
        }


7.2 分析

1.上述 获取 userInfo的逻辑要在好多地方使用,

2.那么在使用的地方都需要重写 constructor componentDidMount ,显然这是冗余操作

3.这个时候需要代码 重用,所以可以选择高阶组件,对应上述的优点之一


8. 属性代理 用法


高阶函数的基本结构是 函数,参数是组件,返回新的组件

所以基本写法都是差不多的

8.1 基本结构


function withUserData(WrappedComponent) {
            return class extends React.Component {
                constructor(props) {
                    super(props)
                    this.state = { userInfo: {} }
                }
                componentDidMount() {
                    let userInfo = JSON.parse(localStorage.getItem("userInfo"))
                    this.setState({ userInfo })
                }
                render() {
                    // ...this.props 传递给当前组件的属性继续向下传递
                    return <WrappedComponent userInfo={this.state.userInfo} {...this.props} />
                }
            }
        }


8.2 分析

1.函数名字可以随便起

2.参数名一般都是WrappedComponent, ed代表被包裹 ,所以整体代表 被包裹的组件,

注意

3.这里只封装了获取 userInfo数据的逻辑,render,布局可以不管

4.然后以属性的形式传递给包装的组件WrappedComponent

5.WrappedComponent 中直接通过 props属性获取需要的数据

6.其他组件也需要这段逻辑时就可以通过withUserData 高阶组件包装组件来使用

拔高

1.高阶组件的主要功能是封装并分离组件的通用逻辑,让通用逻辑在组件间更好地被复用。

2.高阶组件的这种实现方式,本质上是一个装饰者设计模式。


9. 使用高阶组件


9.1 需要使用的组件


class UserView2 extends React.Component {
            render() {
                // 注意这里变为 props属性接收传值
                let { userInfo } = this.props
                return (
                    <div>
                        <h1>{userInfo.name}</h1>
                        <p>{userInfo.description}</p>
                    </div>
                )
            }
            // 省略其他逻辑,重点是当前知识点
        }

这个组件也需要用到获取 userInfo数据的逻辑

9.2 和高阶组件联合使用


const UserHOC = withUserData(UserView2)

函数调用,参数是组件

9.3 显示


let App = () => {
            return (
                <div>
                    <h1>App</h1>
                    <UserView />
                    <UserHOC />
                </div>
            )
        }
        ReactDOM.render(<App />, document.querySelector("#app"))

直接作为组件来使用


10. 高阶组件与父组件区别


这里很多道友有疑问了,这不和父组件一样嘛干啥这么麻烦呢

1.首先从逻辑的执行流程上来看,高阶组件确实和父组件比较相像,

2.但是高阶组件强调的是逻辑的抽象。高阶组件是一个函数,函数关注的是逻辑;

3.父组件是一个组件,组件主要关注的是UI/DOM。如果逻辑是与DOM直接相关的,那么这部分逻辑适合放到父组件中实现;

4.如果逻辑是与DOM不直接相关的,那么这部分逻辑适合使用高阶组件抽象,如数据校验、请求发送等。


11.后续


看来一篇文章还真不行,接着写




相关文章
|
26天前
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
62 0
|
14天前
|
存储 前端开发 测试技术
React组件的最佳实践
React组件的最佳实践
|
12天前
|
前端开发 API 开发者
React 文件上传组件 File Upload
本文详细介绍了如何在 React 中实现文件上传组件,从基础的文件选择和上传到服务器,再到解决文件大小、类型限制、并发上传等问题,以及实现多文件上传、断点续传和文件预览等高级功能,帮助开发者高效构建可靠的应用。
39 12
|
7天前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
18 4
|
14天前
|
前端开发 JavaScript API
React 文件下载组件 File Download
本文介绍了在React中实现文件下载组件的方法,包括使用`a`标签和JavaScript动态生成文件,解决了文件路径、文件类型、大文件下载及文件名乱码等问题,并展示了使用第三方库`file-saver`和生成CSV文件的高级用法。
30 6
|
11天前
|
前端开发 JavaScript API
React 文件下载组件:File Download
本文详细介绍了如何在React应用中实现文件下载组件,包括基本概念、实现步骤和代码示例。同时,探讨了常见问题如文件类型不匹配、文件名乱码等及其解决方法,旨在提升用户体验和代码可维护性。
30 2
|
15天前
|
存储 前端开发 JavaScript
React 文件上传组件 File Upload
本文介绍了如何在 React 中实现文件上传组件,包括基本的概念、实现步骤、常见问题及解决方案。通过 `&lt;input type=&quot;file&quot;&gt;` 元素选择文件,使用 `fetch` 发送请求,处理文件类型和大小限制,以及多文件上传和进度条显示等高级功能,帮助开发者构建高效、可靠的文件上传组件。
41 2
|
16天前
|
存储 前端开发
在React框架中,如何使用对象来管理组件的状态
在React中,组件状态通过`state`对象管理,利用`setState`方法更新状态。状态变化触发组件重新渲染,实现UI动态更新。对象结构清晰,便于复杂状态管理。
|
19天前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
57 2
|
20天前
|
前端开发 JavaScript API
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。