【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博客

相关推荐
天雪浪子7 分钟前
Python入门教程之逻辑运算符
开发语言·python
落羽的落羽21 分钟前
【C++】特别的程序错误处理方式——异常机制
开发语言·c++
通达的K36 分钟前
Java实战项目演示代码及流的使用
java·开发语言·windows
海海思思44 分钟前
Redux Toolkit的前世今生:从繁琐到简洁的状态管理革命
react.js·redux
小爱同学_1 小时前
React知识:useState和useRef的使用
前端·react.js
再学一点就睡1 小时前
双 Token 认证机制:从原理到实践的完整实现
前端·javascript·后端
云:鸢1 小时前
C语言链表设计及应用
c语言·开发语言·数据结构·链表
幻灵尔依2 小时前
前端编码统一规范
javascript·vue.js·代码规范
前端小巷子2 小时前
JS 实现图片瀑布流布局
前端·javascript·面试