当前位置: 首页 > news >正文

如何解决按钮重复点击

问题背景

在日常开发中,我们经常会遇到这样的场景:

  • 用户疯狂点击提交按钮
  • 表单重复提交导致数据异常
  • 批量操作按钮被连续触发

这些问题如果处理不当,轻则影响用户体验,重则可能造成数据错误。

解决方案

我们可以封装一个自定义 Hook

import {useState,useCallback,useRef} from 'react'function useLock(asyncFn) {const [loading, setLoading] = useState(false)const asyncFnRef = useRef(null)asyncFnRef.current = asyncFnconst run = useCallback(async (...args) => {if(loading) returnsetLoading(true)try {await asyncFnRef.current(...args)} finally {setLoading(false)}}, [loading])return [loading,run]
}

然后封装一个通用的 Button 组件

import {Button as AntButton} from 'antd'const Button = ({onClick,...props})=>{const {loading, run} = useLock(onClick || (()=> {}))return <AntButton loading={loading} {...props} onClick={run}></button>
}

使用示例

const Demo = () => {const handleSubmit = async () => {// 模拟异步请求await new Promise(resolve => setTimeout(resolve, 2000))console.log('提交成功')}return (<Button onClick={handleSubmit}>提交</Button>)
}

方案优势

  • 零侵入性 :使用方式与普通按钮完全一致
  • 自动处理 :自动管理 loading 状态,无需手动控制

相关文章:

  • Java高频基础面试题
  • 画家沈燕的山水实验:在传统皴法里植入时代密码
  • Java LocalDateTime类常用时间操作详解
  • 在windows系统中安装图数据库NEO4J
  • 2025年JavaScript性能优化全攻略
  • OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)
  • RoPE长度外推:外插内插
  • Microsoft 365 Copilot:为Teams在线会议带来多语言语音交流新体验
  • 内存安全革命:工具、AI 与政策驱动的 C 语言转型之路
  • Mac配置php开发环境(多PHP版本,安装Redis)
  • MYSQL库表设计:范式
  • Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
  • [Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释
  • 【AI提示词】蝴蝶效应专家
  • 编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法
  • JWT原理及工作流程详解
  • 图像匹配导航定位技术 第 10 章
  • 单片机-STM32部分:10、串口UART
  • 虚拟文件系统
  • Rust 中的 Pin 和 Unpin:内存安全与异步编程的守护者
  • 领证不用户口本,还需哪些材料?补领证件如何操作?七问七答
  • 马云再次现身阿里打卡创业公寓“湖畔小屋”,鼓励员工坚持创业精神
  • 逆境之上,万物生长
  • 国家主席习近平同普京总统出席签字和合作文本交换仪式
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长