react事件回調(diào)中使用防抖失敗的常見錯誤和正確使用方式
使用時常見的錯誤和原因
問題:直接把debounce(防抖函數(shù))當(dāng)回調(diào)函數(shù)用(體現(xiàn)在debounce內(nèi)執(zhí)行函數(shù),而不是函數(shù)本身)
報錯代碼:func is not a function TypeError: func is not a function at eval (http://localhost:3005/static/js/bundle.js:306181:32)。
原因:debounce的基本用法是:
傳入一個“函數(shù)”和等待時間,返回一個新的“防抖后函數(shù)”。你應(yīng)該調(diào)用返回的這個新函數(shù),而不是在debounce內(nèi)直接執(zhí)行原函數(shù)。
onChange={(debounce(changeDepartmentId("123"), 300))}
問題:直接把debounce(防抖函數(shù))套在回調(diào)函數(shù)外面,但是debounce內(nèi)的回調(diào)函數(shù)卻沒有執(zhí)行任何內(nèi)容。
錯誤代碼和原因:對react中事件回調(diào)了解不夠,導(dǎo)致防抖函數(shù)沒有執(zhí)行。
//這種的回調(diào)是把 debounce 函數(shù)作為屬性傳給子組件,而父中定義的changeDepartmentId只是單純的函數(shù) onChange={debounce(changeDepartmentId, 300)} // 這種的回調(diào)是把 changeDepartmentId 函數(shù)作為屬性傳遞給子組件,當(dāng)onChange事件觸發(fā),子組件內(nèi)調(diào)用 changeDepartmentId 函數(shù) onChange={changeDepartmentId} // 這種寫法是直接在onChange事件中調(diào)用 changeDepartmentId 函數(shù) onChange={(value)=>changeDepartmentId(value)}
問題:正確使用了防抖但是沒有起到防抖效果,常見原因和錯誤代碼:
這樣每次調(diào)用 changeDepartmentId,都會重新創(chuàng)建一個新的 debounce 實例,而不是復(fù)用同一個防抖函數(shù)。
這樣的話,防抖的定時器每次都是新的,根本起不到“上一次未到時間就清除本次”的效果,所以沒有防抖。
changeDepartmentId={(value) => { debounce(setState(prev => ({ ...prev,id:value})), 300) }}
正確用法下的解決方案
在組件外部或 useCallback/useMemo 里只創(chuàng)建防抖函數(shù),然后復(fù)用它。 (防止防抖函數(shù)重復(fù)創(chuàng)建)
//部門編號搜索聯(lián)想,useCallback防止函數(shù)重新創(chuàng)建實例 const changeDepartmentId = useCallback( //正確防抖 debounce((value: string) => { //設(shè)置搜索值 setState(prev => ({ ...prev, searchData: { ...prev.searchData, departmentIdentifier: value } })) }, 300), [] ); //使用回調(diào) changeDepartmentId={changeDepartmentId}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
在React聊天應(yīng)用中實現(xiàn)圖片上傳功能
在現(xiàn)代聊天應(yīng)用中,除了文字和表情,圖片分享也是一個重要的功能,本文將詳細(xì)介紹如何在基于 React 的聊天應(yīng)用中實現(xiàn)圖片上傳和預(yù)覽功能,感興趣的小伙伴跟著小編一起來看看吧2025-05-05React 模塊聯(lián)邦多模塊項目實戰(zhàn)詳解
這篇文章主要介紹了React 模塊聯(lián)邦多模塊項目實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10react+axios實現(xiàn)github搜索用戶功能(示例代碼)
這篇文章主要介紹了react+axios實現(xiàn)搜索github用戶功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09React?Router?v6路由懶加載的2種方式小結(jié)
React?Router?v6?的路由懶加載有2種實現(xiàn)方式,1是使用react-router自帶的?route.lazy,2是使用React自帶的?React.lazy,下面我們就來看看它們的具體實現(xiàn)方法吧2024-04-04解決React報錯Parameter 'props' implicitly&nb
這篇文章主要為大家介紹了React報錯Parameter 'props' implicitly has an 'any' type的解決處理方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12