React 自定义hook 之 防抖和节流

一、简介

防抖和节流主要用于控制事件触发频率,提高页面性能和用户体验。

防抖: 当事件被触发后,在一定时间内有新的对应事件,则会取消老的事件执行。

节流: 当事件触发后,在一定时间内会忽略新的事件执行。

二、技术实现

1、useDebounce hook

javascript 复制代码
export const useDebounce = (state, delay) => {
    const [debounceState, setDebounceState] = useState({...state});
    
    useEffect(() => {
        const timeout =  setTimeout(() => {
            setDebounceParam({
                ...param,
            });
        }, delay);
        return () => clearTimeout(timeout);
    }, [state]);
    
}

使用样例:

javascript 复制代码
export UserComponent = ()=>{
    const [userName, setUserName] = useState("");
    const [user, setUser] = useState({});
    const debounceUserName = useDebounce(userName, 300);
    useEffect(() => {
        User user = getUserByUserName(userName);
        setUser(...user);
    }, [debounceUserName]);
    
    return (
    <div>
        用户名:<input type = 'text' value = {userName} onChange = {setUserName}/>
        用户信息: <span>{user.info}</span>
    <div/>    
    );
}

2.useThrottle hook

javascript 复制代码
export const useThrottle = (state, limit) =>{
    const [throttleState, setThrottleState] = useState(...state);
    // 记录下上次触发的时间
    const [lastTrigger, setLastTrigger] = useState(Date.now());
    
    useEffect(() => {
        const timeout = setTimeOut(() =>{
            if (Date.now() - lastTrigger < dealy){
                return;
            }
            setThrottleState(throttleState);
            setLastTrigger(now);
        });
        return clearTimeout(timeout);
    }, [state])
}
相关推荐
前端若水1 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger1 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)1 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态1 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态1 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart1 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe52 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架
IT_陈寒3 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
idcu4 小时前
深入 Lyt.js 组件系统:L2 渲染引擎层的核心
前端·typescript
这是程序猿4 小时前
Spring Boot自动配置详解
java·大数据·前端