【REACT18.x】CRA+TS+ANTD5.X封装自定义的hooks复用业务功能

模拟react中的hooks方法,实现自定义的hooks来封装我们需要重复使用的组件,来优化代码。这种hooks也是利用了react的原生hooks来实现我们需要的特定业务,可以返回任何我们需要的值,也可以不返回值,作为一个副作用方法使用

第三方hooks

下面,封装了几个自己的简单hooks,加深下对hooks的理解

修改页面标题

  • 实现效果

  • 实现代码

js 复制代码
import { useEffect } from 'react'

export function useTitle(title: string): void {
    useEffect(() => {
        document.title = title
    }, [])
}

捕获鼠标位置

  • 实现效果
  • 实现代码
js 复制代码
import { useCallback, useEffect } from 'react'
import { useImmer } from 'use-immer'

type TPosition = {
    x: number
    y: number
}

function useMouse(): TPosition {
    const [position, setPosition] = useImmer<TPosition>({
        x: 0,
        y: 0
    })
    const updateMouse = useCallback((e: MouseEvent) => {
        console.log('useEffect updateMouse')
        setPosition(draft => {
            draft.x = e.clientX
            draft.y = e.clientY
        })
    }, [])

    useEffect(() => {
        document.addEventListener('mousemove', updateMouse)

        return () => {
            document.removeEventListener('mousemove', updateMouse)
        }
    })

    return position
}

export default useMouse

异步请求

  • 实现效果
  • 实现代码
js 复制代码
import { useEffect } from 'react'
import { useImmer } from 'use-immer'

type TResult = {
    name: string
    age: number
}
function getInfo(): Promise<TResult> {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve({
                name: 'why',
                age: 18
            })
        }, 2000)
    })
}

const useGetInfo = () => {
    const [loading, setLoading] = useImmer(false)
    const [info, setInfo] = useImmer<TResult | null>(null)

    useEffect(() => {
        setLoading(true)
        getInfo().then(result => {
            setInfo(result)
            setLoading(false)
        })
    }, [])

    return { loading, info }
}

export default useGetInfo
相关推荐
开开心心就好1 分钟前
操作简单的ISO文件编辑转换工具
java·前端·科技·edge·pdf·安全威胁分析·ddos
盐水冰1 分钟前
【HTML】(1)- 演示&标记语言
前端·html
还是大剑师兰特2 分钟前
Pinia介绍及Vue3配置示例
前端·javascript·vue.js
李少兄7 分钟前
网页应用化部署指南:基于 Edge 浏览器创建桌面快捷方式
前端·edge
IT_陈寒8 分钟前
Python的异步陷阱:我竟然被await坑了一整天
前端·人工智能·后端
光影少年8 分钟前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
Fanfffff72011 分钟前
从 6s 到 3s:一次电商前端性能优化实践的系统性总结
前端·性能优化
cypking12 分钟前
npm 依赖包版本扫描提示插件Version Lens
前端·npm·node.js
还是大剑师兰特14 分钟前
Vue3 Mixin 与 Vue2 Mixin 核心区别
前端·javascript·vue.js
188号安全攻城狮16 分钟前
【前端基础知识】JavaScript 数组方法总结:从表格速查到分类详解
开发语言·前端·javascript·网络安全