[React] 自定义hooks设计模式

文章目录

      • 1.自定义hooks设计
        • [1.1 自定义hooks](#1.1 自定义hooks)
        • [1.2 设计一个自定义hooks](#1.2 设计一个自定义hooks)
        • [1.3 自定义hooks的驱动条件](#1.3 自定义hooks的驱动条件)
        • [1.4 自定义hooks的通用模式](#1.4 自定义hooks的通用模式)
        • [1.5 自定义hooks的条件限定](#1.5 自定义hooks的条件限定)

1.自定义hooks设计

react-hooks是react16.8以后,react新增的钩子API,目的是增加代码的可复用性,逻辑性,弥补无状态组件没有生命周期,没有数据管理状态state的缺陷。react-hooks思想和初衷,也是把组件,颗粒化,单元化,形成独立的渲染环境,减少渲染次数,优化性能。

1.1 自定义hooks

自定义hooks是在react-hooks基础上的一个拓展,可以根据业务需要制定满足业务需要的hooks,更注重的是逻辑单元。

通过业务场景不同,我们到底需要react-hooks做什么,怎么样把一段逻辑封装起来,做到复用,这是自定义hooks产生的初衷。

1.2 设计一个自定义hooks

hooks 专注的就是逻辑复用, 是我们的项目,不仅仅停留在组件复用的层面上。hooks让我们可以将一段通用的逻辑存封起来。将我们需要它的时候,开箱即用即可。

1.3 自定义hooks的驱动条件

hooks本质上是一个函数。函数的执行,决定与无状态组件组件自身的执行上下文。每次函数的执行(本质上就是组件的更新)就会执行自定义hooks的执行,由此可见组件本身执行和hooks的执行如出一辙。

那么prop的修改,useState,useReducer使用是无状态组件更新条件,那么就是驱动hooks执行的条件。 我们用一幅图来表示如上关系。

1.4 自定义hooks的通用模式
js 复制代码
const [ xxx , ... ] = useXXX(参数A,参数B...)

编写hooks的时候, 需要注意传入和返回的值。

1.5 自定义hooks的条件限定

如果自定义hooks没有设计好,比如返回一个改变state的函数,但是没有加条件限定限定,就有可能造成不必要的上下文的执行,更有甚的是组件的循环渲染执行。

js 复制代码
import React, {useEffect, useMemo, useState} from 'react';

// const mock_data = [
//     {
//         name: '1',
//         age: 1
//     },
//     {
//         name: "2",
//         age: 2
//     }
// ]

function useFormatList(list){
    return list.map(item=>{
       console.log(1111)
       return item.toUpperCase()
   })
}

const list = [ 'aaa' , 'bbb' , 'ccc'  ]
function UseHooks(props) {
    const [num, setNum] = useState(0)
    const newList = useFormatList(list)

    return <div>
        <div className="list" >
            { newList.map(item=><div key={item} >{ item }</div>) }
        </div>
        <div className="number" >
            <div>{ num }</div>
            <button onClick={()=> setNum(num + 1) } >add</button>
        </div>
    </div>
}

export default UseHooks;

格式化父组件传递过来的list数组,并将小写变成大写,但是当我们点击add。 理想状态下数组不需要重新format,但是实际跟着执行format。无疑增加了性能开销。

js 复制代码
function useFormatList(list) {
    return useMemo(() => list.map(item => {
        console.log(1111)
        return item.toUpperCase()
    }), [])
}

所以一个好用的自定义hooks,一定要配合useMemo ,useCallback 等api一起使用。

相关推荐
SuperEugene28 分钟前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
子兮曰1 小时前
Bun v1.3.11 官方更新全整理:新增功能、关键修复与升级验证
javascript·node.js·bun
Setsuna_F_Seiei1 小时前
AI 对话应用之页面滚动交互的实现
前端·javascript·ai编程
wefly20172 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
英俊潇洒美少年3 小时前
vue如何实现react useDeferredvalue和useTransition的效果
前端·vue.js·react.js
kyriewen113 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
英俊潇洒美少年3 小时前
react19和vue3的优缺点 对比
前端·javascript·vue.js·react.js
~无忧花开~5 小时前
React生命周期全解析
开发语言·前端·javascript·react.js·前端框架·react
哈__6 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-maps
javascript·react native·react.js
SuperEugene6 小时前
Axios + Vue 错误处理规范:中后台项目实战,统一捕获系统 / 业务 / 接口异常|API 与异步请求规范篇
前端·javascript·vue.js·前端框架·axios