函數(shù)式組件之防抖

現(xiàn)在react基本都是函數(shù)式組件的寫(xiě)法,你會(huì)發(fā)現(xiàn)用到使用防抖函數(shù)場(chǎng)景的時(shí)候,發(fā)現(xiàn)自己原來(lái)寫(xiě)的防抖函數(shù)不生效了,究其原因是因?yàn)楹瘮?shù)式組件每次都會(huì)重新創(chuàng)建,從而每次都重新創(chuàng)建定時(shí)器導(dǎo)致防抖時(shí)效,簡(jiǎn)單記錄一下:

import { useEffect, useRef } from "react"

export const useDebounce = (fn:Function, delay:number)=>{
    //使用useRef保存計(jì)數(shù)器,這樣就能保證在組件更新時(shí)始終是同一個(gè)計(jì)時(shí)器,而不是重新創(chuàng)建
    const {current} = useRef<{timmer:any}>({timmer:null})
    useEffect(()=>{
        return ()=>{
            //組件銷毀時(shí)清除計(jì)時(shí)器
            clearTimeout(current.timmer)
        }
    },[])
    return function(...args:any[]){
        //如果計(jì)時(shí)器存在,則清除該計(jì)時(shí)器
        if(current.timmer){
            clearTimeout(current.timmer)
        }
        //重新賦值計(jì)時(shí)器,并在計(jì)時(shí)結(jié)束后執(zhí)行回調(diào)函數(shù)
        current.timmer = setTimeout(() => {
            fn.apply(useDebounce,args)
        }, delay);
    }
}

這樣我們的自定義防抖hooks接受兩個(gè)參數(shù):防抖處理的函數(shù)和防抖的延時(shí)時(shí)間,hooks返回值是經(jīng)過(guò)防抖處理的函數(shù),這樣防抖功能就生效了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容