【React】常用的自定义 hooks

自定义 hooks 或者第三方 hooks,抽离公共部分,复用代码。

修改页面标题

tsx 复制代码
import React, {useEffect} from 'react';

function useTitle(title) {
    useEffect(() => {
        document.title = title;
    }, []);
}

export default useTitle;

获取鼠标位置

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

function useMouseMove() {
    const [x, setX] = useState(0)
    const [y, setY] = useState(0)

    const handleMouseMove = (event) => {
        setX(event.clientX)
        setY(event.clientY)
    }

    useEffect(() => {
        window.addEventListener('mousemove', handleMouseMove)
        return () => {
            window.removeEventListener('mousemove', handleMouseMove)
        }
    }, [x, y]);
    return {x, y};
}

export default useMouseMove;

异步获取数据

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

function getInfo():Promise<string> {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(Date.now().toString())
        }, 1500)
    })
}

function useGetInfo() {
    const [loading, setLoading] = useState(true)
    const [info, setInfo] = useState('')
    useEffect(() => {
        getInfo().then(info => {
            setInfo(info)
            setLoading(false)
        })
    }, []);
    return { loading, info }
}

export default useGetInfo;
tsx 复制代码
import useTitle from "./hooks/useTitle.tsx";
import useMouseMove from "./hooks/useMouseMove.tsx";
import useGetInfo from "./hooks/useGetInfo.tsx";

function App() {

    useTitle('React Demo')

    const {x, y} = useMouseMove()
    const {loading, info} = useGetInfo()

    return (
        <>
            <h1>React Demo</h1>
            <div>鼠标位置:{x} {y}</div>
            <div>异步获取当前时间:{loading ? '加载中' : info}</div>
        </>
    )
}

export default App

第三方 hooks

常见的有 ahooks 或者 react-use。

ahooks - React Hooks Library - ahooks 3.0

https://github.com/streamich/react-use

我们上面的 hooks 几乎在这些第三方库中都可以找到。

Hooks 规则

  1. 命名规则:

    • Hook 必须 useXxx 格式来命名。
  2. 调用位置

    • 组件内部
    • 其他 Hook 内部

    组件外部,或一个普通函数中,不能调用 Hook

  3. 顺序一致

    Hook 必须是组件"第一层代码"

    • Hook 不可放在 if 等条件语句中 ( 或者前面有 return ,也算是条件 )
    • Hook 不可放在 for 等循环语句中
  4. 闭包陷阱

异步函数中获取 state 时,可能不是最新的 state 值。

解决方案:替换为 useRef ------ 但 ref 变化不会触发 rerender ,所以得结合 state 一起。详情见:【React】React Hooks-CSDN博客

相关推荐
浪子明X1 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
尾善爱看海1 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
xiangyun614 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun614 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山5 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
DevRay6 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
李明卫杭州6 小时前
React 复合事件系统对比解析
前端·javascript·react.js
free-elcmacom6 小时前
C++学习<1>程序分区
开发语言·c++
醉颜凉6 小时前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语6 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重