React hooks - 自定义hooks

自定义hooks

        • [自定义封装鼠标位置的 hook](#自定义封装鼠标位置的 hook)
        • [自定义封装秒数倒计时的 hook](#自定义封装秒数倒计时的 hook)

在 src 目录下新建 hooks/index.ts 模块,自定义hooks都写在这里,自定义hooks都以use开头

自定义封装鼠标位置的 hook
javascript 复制代码
export const useMousePosition = (delay:number = 0) => {
  const [position, setPosition] = useState({ x: 0, y: 0 }) // 鼠标的位置
  useEffect(() => {
    let timeId : null | NodeJS.Timeout = null
    const mouseMoveHandler = (e: MouseEvent) => {
      if(timeId !== null) return 
      timeId = setTimeout(() => {
         console.log({ x: e.clientX, y: e.clientY })
         setPosition({ x: e.clientX, y: e.clientY })
         timeId = null 
      }, delay)
    }
    window.addEventListener('mousemove', mouseMoveHandler)
    return () => window.removeEventListener('mousemove', mouseMoveHandler)
  }, [])
  return position // 返回鼠标的位置
}
javascript 复制代码
import { useMousePosition } from '@/hooks/index'
const MouseInfo: React.FC = () => {
  const position = useMousePosition(200) // 调用自定义hooks获取位置,还可以传递参数
  return (
    <>
      <p>鼠标的位置:{JSON.stringify(position)}</p>
    </>
  )
}
自定义封装秒数倒计时的 hook
javascript 复制代码
// 设置hooks函数的类型,num后面加一个?代表可传可不穿,不穿默认为10
type useCountDown = (num?: number) => [number, boolean] 
export const useCountDown: useCountDown = (num: number = 10) => {
  const seconds = Math.round(Math.abs(num)) || 10 // 对边界值进行处理,取绝对值再取整,如果传入为0默认设置为10
  const [count, setCount] = useState(seconds) 
  const [disabled, setDisabled] = useState(true) 
  // useEffect(() => {
  //  let intervalId : null | NodeJS.Interval = null
  //  intervalId = setInterval(() => {
  //     if(count>1) setCount(prev=>prev-1)
  //     else {
  //       clearInterval(intervalId)
  //       setDisabled(false)
  //     }
  //  }, 1000)
  //  return ()=>clearInterval(intervalId)
  // }, [])
  useEffect(() => {
    let timeId : null | NodeJS.Timeout = null
    timeId = setTimeout(() => {
       if(count>1) setCount(prev=>prev-1)
       else {
         clearTimeout(intervalId)
         setDisabled(false)
       }
    }, 1000)
    return ()=>clearTimeout(intervalId)
  }, [count])
  return [restCount,disabled] // 返回鼠标的位置
}
javascript 复制代码
import { useCountDown } from '@/hooks/index'
const MouseInfo: React.FC = () => {
  const [count,disabled] = useCountDown(5) 
  return (
    <>
      <button disabled={disabled}>{disabled?`请仔细阅读本协议(${count})秒`:'请确认协议'}</button>
    </>
  )
}
相关推荐
独立开发者屿风8 小时前
在 React 里把 import 排得明明白白:一份让人极度舒适的配置指南
react.js·代码规范
smileNicky9 小时前
React 弹窗组件如何在新标签页打开?
javascript·react.js·ecmascript
光影少年11 小时前
react navite 简单原生方法双向调用示例
javascript·react native·react.js
zzzzzz31011 小时前
react-bits:把“酷炫组件”放回 React 组件化的语境里看
javascript·react.js·动效
zzz_236821 小时前
个人 AI 记忆如何跨工具复用:用 Markdown、索引和 Skill 搭一个可治理的记忆库
前端·人工智能·react.js·前端框架·agent·agent测评
l1m0_1 天前
智能电动自行车管理后台实战:AI生成页面与React组件化技巧
前端·react.js·ui·ai·设计
坚果的博客1 天前
认识 CPF-RN:React Native 鸿蒙官方社区与四大核心仓库
react native·react.js·harmonyos
Carl_奕然1 天前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
名为沙丁鱼的猫7291 天前
React/JSX 编码规范
前端·javascript·react.js