比节流防抖更优的选择(特定情况)

server/2025/2/8 8:55:13/

在这里以react、shadcn为例,此处例子展示的特定情况为:删除按钮

disabled+useState禁用

以下代码的设置可以保证按钮点击后立即禁用

const [isRemoving,setIsRemoving] = useState(false);
<AlertDialogActiondisabled={isRemoving}//默认可点击onClick={(e) => {e.stopPropagation();//禁止冒泡setIsRemoving(true);//立即禁止点击remove({ id: documentId }).finally(() => {setIsRemoving(false);});}}
>Delete
</AlertDialogAction>;
对比节流方案
const DeleteAction = () => {const isThrottled = useRef(false);const handleDelete = () => {if (isThrottled.current) return;isThrottled.current = true;remove({ id: documentId });setTimeout(() => {isThrottled.current = false;}, 1000);};return (<AlertDialogAction onClick={handleDelete}>Delete</AlertDialogAction>);
};
对比防抖方案
const DeleteAction = () => {const timerRef = useRef<NodeJS.Timeout>();const handleDelete = () => {// 清除之前的定时器if (timerRef.current) {clearTimeout(timerRef.current);}// 设置新的定时器timerRef.current = setTimeout(() => {remove({ id: documentId });}, 1000);};// 组件卸载时清理定时器useEffect(() => {return () => {if (timerRef.current) {clearTimeout(timerRef.current);}};}, []);return (<AlertDialogAction onClick={handleDelete}>Delete</AlertDialogAction>);
};
为什么不选择节流防抖

由以上代码可以看出明显是第一种方案的代码量少性能更优方便阅读和维护,并且删除按钮每次有且仅需要点击一次不需要多次点击,所以使用节流防抖有点“画蛇添足”,这里只是以删除按钮为例,不仅限于删除按钮情况,可在写代码之时留意一下是否“有必要”使用节流防抖函数。

再者像节流防抖这类易实现的函数推荐手写而不使用库函数,为什么现在支持Tree Shaking按需引入还需要手写?因为可以根据实际情况高度定制和简化代码(体积更小)以及性能优化,当然手写不易实现的功能还是需要使用第三方库,所以我推荐采用混合策略:核心路径代码手写优化 + 复杂功能使用高质量小型库。


http://www.ppmy.cn/server/165904.html

相关文章

[Harmonyos]相机功能开发基础知识篇(持续更新)

系列文章目录 【HarmonyOS】纯血鸿蒙真实项目开发—经验总结贴 文章目录 系列文章目录前言一、曝光三要素&#xff1f;1.什么是“曝光2.光圈&#xff08;Aperture&#xff09;——控制进光量和背景虚化- - -光圈的影响 3.快门速度&#xff08;Shutter Speed&#xff09;——控…

springboot配置redis

文章目录 前置依赖配置yml 配置自定义配置&#xff08;非必要&#xff09;正常使用 前置 你使用的是 springboot 项目&#xff0c;使用 yml 来进行配置&#xff0c;properties 同理 依赖配置 <dependency><groupId>org.springframework.boot</groupId><…

苹果再度砍掉AR眼镜项目?AR真的是伪风口吗?

曾经&#xff0c;AR游戏一度异常火热&#xff0c;宝可梦go让多少人不惜翻墙都要去玩&#xff0c;但是也没过去几年&#xff0c;苹果被曝出再度砍掉了AR眼镜项目&#xff0c;面对着市场的变化&#xff0c;让人不禁想问AR真的是伪风口吗&#xff1f; 一、苹果再度砍掉AR眼镜项目&…

python编程-类结构,lambda语法,原始字符串

一个类的基本结构包括以下部分&#xff1a; 类名&#xff1a;用来描述具有相同属性和方法的对象的集合。 属性&#xff1a;类变量或实例变量&#xff0c;用于处理类及其实例对象的相关数据。 方法&#xff1a;在类中定义的函数&#xff0c;用于执行特定操作。 构造器&#xff…

【JS】element-ui table展示勾选状态

element-ui table 我将勾选的值存在multipleSelection中&#xff0c;在表格更新后&#xff0c;再遍历&#xff0c;来展示勾选状态。这样可行吗&#xff1f; 在使用 Element UI 的 el-table 组件时&#xff0c;将勾选的值存储在 multipleSelection 中&#xff0c;然后在表格更新…

【c++】构造函数

【c】构造函数 1.函数名称与类同名&#xff1a;构造函数名称必须与类名严格一致。 2.无返回值类型&#xff1a;无需声明返回类型&#xff08;包括 void&#xff09; 3.构造函数一般为公有来对数据成员进行初始化(对象一般不能调用构造函数 但是可以使用定位new来调用构造函数–…

Maven 依赖管理全面解析

目录 1. Maven 简介 2. 依赖的基本概念 依赖坐标 依赖范围 3. Maven 仓库 本地仓库 远程仓库 4. 依赖传递 5. 依赖冲突 6. 在 pom.xml 文件中管理依赖 基本依赖配置 依赖范围配置 依赖排除配置 依赖管理配置&#xff08;&#xff09; 1. Maven 简介 Maven 是一个…

06vue3实战-----项目开发准备

06vue3实战-----项目开发准备 1.CSS样式的重置1.1先引入第三方库normalize.css1.2自己写一些默认样式 2.路由配置2.1安装路由:2.2挂载路由:2.3配置路由 3.状态管理配置3.1安装pinia3.2挂载pinia3.3创建一个store文件3.4应用store 4.网络请求封装axios4.1再封装axios4.2使用封装…