男女做爽爽爽网站-男女做羞羞高清-男女做爰高清无遮挡免费视频-男女做爰猛烈-男女做爰猛烈吃奶啪啪喷水网站-内射白浆一区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

如何解決按鈕重復(fù)點(diǎn)擊?這個(gè)問題掛了80%的人!

admin
2025年4月21日 17:46 本文熱度 82

前言

還記得上周我們團(tuán)隊(duì)在招聘前端工程師,一個(gè)看起來經(jīng)驗(yàn)豐富的候選人坐在我對面。

"你們項(xiàng)目中是如何處理按鈕重復(fù)點(diǎn)擊的問題的?"我拋出了這個(gè)看似簡單的問題。

"這個(gè)簡單,使用防抖就可以了。"他很快回答。

然而,當(dāng)我繼續(xù)追問細(xì)節(jié)時(shí),他卻陷入了沉思...

實(shí)際上,這個(gè)問題看似簡單,但是要真正的解決好,需要考慮很多細(xì)節(jié)。在我面試了很多候選人中,能完整答出來的不到20%。

問題背景

在日常開發(fā)中,我們經(jīng)常會(huì)遇到這樣的場景:

  • 用戶瘋狂點(diǎn)擊提交按鈕
  • 表單重復(fù)提交導(dǎo)致數(shù)據(jù)異常
  • 批量操作按鈕被連續(xù)觸發(fā)

這些問題如果處理不當(dāng),輕則影響用戶體驗(yàn),重則可能造成數(shù)據(jù)錯(cuò)誤。今天,就讓我們通過一個(gè)真實(shí)的面試場景,逐步深入這個(gè)問題

面試場景

面試官:項(xiàng)目中如何處理按鈕重復(fù)點(diǎn)擊的問題?

候選人:可以使用防抖(debounce)。

js
?
const debouncedSubmit = debounce(submit, 300);

面試官:那假設(shè)我防抖設(shè)置了1秒,我現(xiàn)在請求了,但是接口響應(yīng)比較慢,要3秒,用戶在這3秒內(nèi)點(diǎn)擊了多次,那怎么辦? 防抖是不是就沒用了?

一般說到這里,很多人就不知道怎么搞了

候選人:可以給按鈕加上 loading 狀態(tài),點(diǎn)擊后設(shè)置 loading 為 true,等操作完成后再設(shè)置為 false。

jsx

const [loading, setLoading] = useState(false); const handleSubmit = async () => {    setLoading(true);    try {        await submitData();    } finally {        setLoading(false);    } }

面試官:這個(gè)思路不錯(cuò),但是如果項(xiàng)目中有很多按鈕都需要這樣處理,你會(huì)怎么做?

候選人:額...每個(gè)按鈕都寫一遍 loading 狀態(tài)管理?

面試官:那樣就會(huì)有很多重復(fù)代碼,有沒有想過怎么封裝呢?

到這里也卡掉了很多人

解決方案

我們可以封裝一個(gè)自定義 Hook

js

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

然后封裝一個(gè)通用的 Button 組件

jsx

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

使用示例

jsx

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

可以看到 在 handleSubmit 執(zhí)行的時(shí)候 Button 會(huì)自動(dòng)添加 loading, 在請求完成后 loading 會(huì)自動(dòng)變?yōu)?false。

方案優(yōu)勢

  • 零侵入性 :使用方式與普通按鈕完全一致
  • 自動(dòng)處理 :自動(dòng)管理 loading 狀態(tài),無需手動(dòng)控制

希望這篇文章對你有幫助!


作者:葉小秋
鏈接:https://juejin.cn/post/7494944356534714406
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

該文章在 2025/4/22 18:20:25 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 精品无人区一区二区三区 | 青青青亚洲视频一区免费 | 秋霞在线骑兵区 | 亚洲欧美日韩闷骚影院 | 国产精品麻豆成人av电影艾秋 | av影音先锋天堂网 | 国产精品高潮呻吟久久av无码 | 精品日产一卡2卡三卡4卡 | 亚洲精品卡2卡3卡4卡5卡区 | 欧美亚洲日本在线观看 | 色情五月亚洲中文字幕 | 亚洲国产成人精品无码区在线 | 精品人妻一区二区三区在线潮喷 | 精品国产无限资源免费观看 | 亚洲精品无码一区二区三区四虎 | 一区自拍 | 久久综合九色综合国产 | 国产91精品免费视频 | 国产精品久久精品第一页不卡 | 日本高清视频在线无吗 | 欧美产精品一线二线三线 | 色欲AV在线观看国产精品 | 国产亚洲欧美在线观看视频 | 欧美激情视频二区 | 无码一区中文字幕在线观看 | 又紧又爽又粗精品一区二区 | 亚洲日本国产综合高清 | 成人欧美一区二区三区A片 成人欧美一区二区三区白人 | 在线观看亚洲专区中文字幕 | 国产精品wwwcom976con | 国产一区二区三区内射高清 | 国产麻豆一精品一av一免费精品久久国产字幕高潮 | 亚洲A片成人无码久久精品色欲 | 精品国产一区二区av麻豆不卡 | 日本高清免费中文在线看 | 久久国产vs | 国产jizzjizz视频全部免费 | 日韩国精品一区二区A片 | 无码av中文一区二区三区桃花岛熟女电影国产狠狠免费视频 | 国产三级日本三级在线播放 | 欧美人又长又大又粗无码视频一区 |