React hooks - 自定义hooks

ops/2024/10/20 17:31:37/

自定义hooks

        • 自定义封装鼠标位置的 hook
        • 自定义封装秒数倒计时的 hook

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

自定义封装鼠标位置的 hook
export const useMousePosition = (delay:number = 0) => {const [position, setPosition] = useState({ x: 0, y: 0 }) // 鼠标的位置useEffect(() => {let timeId : null | NodeJS.Timeout = nullconst 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 // 返回鼠标的位置
}
import { useMousePosition } from '@/hooks/index'
const MouseInfo: React.FC = () => {const position = useMousePosition(200) // 调用自定义hooks获取位置,还可以传递参数return (<><p>鼠标的位置:{JSON.stringify(position)}</p></>)
}
自定义封装秒数倒计时的 hook
// 设置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默认设置为10const [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 = nulltimeId = setTimeout(() => {if(count>1) setCount(prev=>prev-1)else {clearTimeout(intervalId)setDisabled(false)}}, 1000)return ()=>clearTimeout(intervalId)}, [count])return [restCount,disabled] // 返回鼠标的位置
}
import { useCountDown } from '@/hooks/index'
const MouseInfo: React.FC = () => {const [count,disabled] = useCountDown(5) return (<><button disabled={disabled}>{disabled?`请仔细阅读本协议(${count})秒`:'请确认协议'}</button></>)
}

http://www.ppmy.cn/ops/45283.html

相关文章

vue3 + vite 项目打包优化

vue项目打包之后生成的dist包体积太大&#xff0c;超过10M, 进行影响项目加载速度。本文章从作者的实践操作写出如何做项目优化。 一、分析包体积过大的原因 项目初始打包体积为10.6M。 使用 rollup-plugin-visualizer 做打包视图分析。 安装命令&#xff1a; npm install…

YOLOv10最详细全面讲解2- 目标检测-环境搭建、训练自己的数据集

YOLOv10没想到出来的如此之快&#xff0c;作为一名YOLO的爱好者&#xff0c;以YOLOv5和YOLOv8的经验&#xff0c;打算出一套从数据集装备->环境配置->训练->验证->目标追踪全系列教程。请大家多多点赞和收藏&#xff01;&#xff01;&#xff01; 系列文章&#xf…

产品经理-原型绘制(五)

1. 概念 用线条、图形描绘出的产品框架&#xff0c;也称为线框图&#xff0c;是需求和功能的具体化表现 2. 常用工具 Axure 3. 类别 3.1 草图原型 手绘图稿&#xff0c;修改方便&#xff0c;规划的早期使用 3.2 低保真原型 简单交互&#xff0c;无设计图&#xff0c;无需…

QT截图程序,可多屏幕截图二,增加调整截图区域功能

上一篇QT截图程序&#xff0c;可多屏幕截图只是实现了最基本的截图功能&#xff0c;虽然能用但是缺点也有&#xff0c;没办法更改选中的区域&#xff0c;这在实际使用时不太方便。这篇增加了这个功能。先看看效果。 实现代码为&#xff1a; 头文件 #ifndef MASKWIDGET_H #de…

K8s service 进阶

文章目录 K8s service 进阶Service 工作逻辑Service 具体实现Service 资源类型ClusterIPNodePortLoadBalancerExternalName Service 与 EndpointEndpoint 与 容器探针自定义Endpoint Service 相关字段sessionAffinityexternalTrafficPolicyinternalTrafficPolicypublishNotRead…

Vue3学习使用axios和qs进行POST请求和响应处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言1.准备工作2.发送POST请求3.处理响应数据4.总结 一、前言 在前端开发中&#xff0c;经常需要与后端进行数据交互&#xff0c;其中包括发送POST请求并处理响…

四数之和-力扣

本题在三数之和的基础上&#xff0c;再增加一重循环进行解答 首先注意的点是&#xff0c;一级剪枝处理&#xff0c;target > 0 && nums[i] > target 此处只有整数才可剪枝处理&#xff0c;如果target为负数&#xff0c;nums[i] < target&#xff0c;也不能代…

redis服务监控:redis_exporter安装与使用

redis监控 使用redis exporter&#xff0c;提供redis最重要的运行指标数据收集&#xff0c;部署了redis exporter以后&#xff0c;prometheus会通过redis exporter暴露的端口拉取数据。 redis exporter下载地址&#xff1a; https://github.com/oliver006/redis_exporter/tag…