React Native防止重复点击

news/2024/9/18 15:40:43/ 标签: react native, react.js, javascript

项目中遇到了点击按钮重复提交的问题,防止重复点击首先是想到的是给点击事件一个定时,下次触发的条件是要距离上一次点击的时间大于N秒的之后才能再执行。

// 防重复点击函数
export const preventRepeatPress = {lastPressTi1me: 0,  	//  上次点击时间      repoTime: 2000,   		//  默认间隔时间2000  onPress(callback: () => void, waitTime: number = 2000) {let currTime = Date.now();if (currTime - this.lastPressTime > this.repoTime) {this.lastPressTime = currTime;this.repoTime = waitTime;         callback && callback();}},
};

在组件上的点击函数onPress中使用preventRepeatPress方法

<Button title="点击按钮" onPress={() => preventRepeatPress.onPress(() => fun())} /> 

在点击的时候可以传入设置间隔时间进行单独控制

() => preventRepeatPress.onPress(() => onCredit(),5000)

第二使用 setTimeout 函数

需要注意的是 timeout 需要放在全局也就是函数外部,否则的话每次调用 timeout 都会重新初始化导致防抖函数失去效果。

定义一个名为 debouncePlus 的函数,它接受一个函数 func,一个等待时间 wait(默认为 1000 毫秒)和一个 immediate 参数

// 定义一个变量 timeout,用于存储定时器的标识,变量作用域需要在函数外部
let timeout: string | number | NodeJS.Timeout | null | undefined = null;export const debouncePlus = (func: { apply: (arg0: any, arg1: IArguments) => void; },wait: number | undefined = 1000,immediate: any
) => {// 变量 result,用于存储函数执行的结果let result: any;// 定义一个内部函数 debounced,它将作为防抖后的函数被返回let debounced = function (this: any) {// 获取当前函数执行的上下文(this 指向)let context = this;// 获取传递给当前函数的参数let args = arguments;// 如果定时器已经存在,清除之前的定时器if (timeout) clearTimeout(timeout);// 如果 immediate 为真if (immediate) {// 如果 timeout 为 null,说明是第一次调用,应该立即执行函数let callNow = !timeout;// 设置一个新的定时器,在等待时间之后将 timeout 置为 nulltimeout = setTimeout(function () {timeout = null;}, wait);// 如果应该立即执行,则调用原始函数,并将结果存储在 result 中if (callNow) result = func.apply(context, args);}// 如果 immediate 为假else {// 设置一个新的定时器,在等待时间之后执行原始函数timeout = setTimeout(function () {func.apply(context, args);}, wait);}// 返回函数执行的结果(如果是 immediate 模式,可能是立即执行的结果;否则可能是 null)return result;};// 给 debounced 函数添加一个 cancel 方法,用于取消正在等待执行的定时器debounced.cancel = function () {clearTimeout(timeout);timeout = null;};// 返回防抖后的函数return debounced;
};

第三使用 hook

/*** 防抖hook*   const { run } = useDebounceFn(() => {setValue(value + 1)},{wait: 500,},);*/
import { useEffect, useMemo, useRef } from 'react';
import { debouncePlus } from './debounce-plus';const isDev = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test';
const isFunction = (value: unknown): value is (...args: any) => any => typeof value === 'function';interface DebounceOptions {wait?: number;leading?: boolean;trailing?: boolean;maxWait?: number;
}type noop = (...args: any[]) => any;function useDebounceFn<T extends noop>(fn: T, options?: DebounceOptions) {if (isDev) {if (!isFunction(fn)) {console.error(`useDebounceFn expected parameter is a function, got ${typeof fn}`);}}const fnRef = useLatest(fn);const wait = options?.wait ?? 1000;const debounced = useMemo(() =>debouncePlus((...args: Parameters<T>): ReturnType<T> => {return fnRef.current(...args);},wait,options,),[],);useUnmount(() => {debounced.cancel();});return {run: debounced,cancel: debounced.cancel,// flush: debounced.flush,};
}export default useDebounceFn;export const useUnmount = (fn: () => void) => {if (isDev) {if (!isFunction(fn)) {console.error(`useUnmount expected parameter is a function, got ${typeof fn}`);}}const fnRef = useLatest(fn);useEffect(() => () => {fnRef.current();},[],);
};export function useLatest<T>(value: T) {const ref = useRef(value);ref.current = value;return ref;
}

有好的思路欢迎评论交流


http://www.ppmy.cn/news/1526760.html

相关文章

详解 Pandas 的 rename 函数

Pandas 的 rename 函数主要是用于对 DataFrame 的行名和列名进行重命名&#xff0c;其基本语法如下&#xff1a; 一、修改行名 1. 数据准备 import pandas as pddf pd.DataFrame({"Jan" : [1, 2, 3],"Feb": [4, 5, 6],"Mar": [7, 8, 9] })pr…

鸿蒙next web组件和h5 交互实战来了

前言导读 鸿蒙next web组件这个专题之前一直想讲一下 苦于没有时间&#xff0c;周末把代码研究的差不多了&#xff0c;所以就趁着现在这个时间节点分享给大家。也希望能对各位读者网友工作和学习有帮助&#xff0c;废话不多说我们正式开始。 效果图 默认页面 上面H5 下面ArkU…

消息队列 Rabbit Direct Exchange

消费端&#xff1a; 修改服务端口&#xff1a; server:port: 8991创建监听器&#xff1a; Component public class MessageListener {/*** 交换机名*/public static final String EXCHANGE_NAME "exchange.direct.order";/*** 路由键*/public static final Strin…

20240912软考架构-------软考161-165答案解析

每日打卡题161-165答案 161、【2014年真题】 难度&#xff1a;一般 企业信息化一定要建立在企业战略规划基础之上&#xff0c;以企业战略规划为基础建立的企业管理模式是建立&#xff08; &#xff09; 的依据。 A&#xff0e;企业战略数据模型 B&#xff0e;企业业务运作模型…

python 读取excel数据存储到mysql

一、安装依赖 pip install mysql-connector-python 二、mysql添加表students CREATE TABLE students (ID int(11) NOT NULL AUTO_INCREMENT,Name varchar(50) DEFAULT NULL,Sex varchar(50) DEFAULT NULL,PRIMARY KEY (ID) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETu…

【Oracle】调优与oracle最大连接数配置

Oracle调优与oracle最大连接数配置 oracle最大连接数是生产环境中最重要的一个调优指标 oracle 默认情况下的最大连接数是150 oracle 默认情况下的允许所有客户终端连接到oracle的最大连接个数是150&#xff0c;超过该改数据数据库拒绝连接接入 文章目录 Oracle调优与oracle最大…

快速使用react 全局状态管理工具--redux

redux Redux 是 JavaScript 应用中管理应用状态的工具&#xff0c;特别适用于复杂的、需要共享状态的中大型应用。Redux 的核心思想是将应用的所有状态存储在一个单一的、不可变的状态树&#xff08;state tree&#xff09;中&#xff0c;状态只能通过触发特定的 action 来更新…

数据在内存中的存储方式

前言&#xff1a;已经好久没更新了&#xff0c;开学之后学习编程的时间少了很多。因此&#xff0c;已经好几个礼拜都没有写文章了。 在讲解操作符的时候&#xff0c;我们就已经学习过了整数在内存中的存储方式。若有不懂的伙伴可以前往操作符详解进行学习。今天我们主要来学习…

java.人机猜拳游戏

人机猜拳&#xff0c;这里我们定义输入0是剪刀&#xff0c;1是石头&#xff0c;2是布。电脑的数字为随机产生&#xff0c;可以用Random。 采用三局制。三局中每一小局中都有输出显示小局的获胜方三局比赛结束后&#xff0c;若电脑获胜次数等于玩家&#xff0c;则输出&#xff1…

使用ENVI之辐射定标

将下载好的遥感影像导入遥感影像处理软件ENVI 5.6中 使用ENVI 5.6的Toolbox中的Radiometric Calibration工具 跳出的Date Input File界面中选中要进行辐射定标的文件选中 再在跳出的Radiometric Calibration界面中将Output Interleave改为BIL再点击Apply FLAASH Settings Soale…

PostgreSQL的表压缩

PostgreSQL的表压缩 PostgreSQL提供了在表或列级别进行数据压缩的功能&#xff0c;以帮助减少存储空间和提高I/O性能。具体来说&#xff0c;PostgreSQL 14及以后的版本引入了对表级和列级压缩的支持。 表压缩 The COMPRESSION clause sets the compression method for the c…

NASA:ATLAS/ICESat-2 L2 A标准化相对反向散射剖面V006

ATLAS/ICESat-2 L2A Normalized Relative Backscatter Profiles V006 ATLAS/ICESat-2 L2 A标准化相对反向散射剖面V006 简介 ATL04 包含大气层的沿轨迹归一化相对后向散射剖面图。 该产品包括完整的 532 nm&#xff08;14 公里&#xff09;未校准衰减后向散射剖面图&#xf…

mysql workbench 如何访问远程数据库

要使用 MySQL Workbench 访问远程数据库&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;获取远程数据库的连接信息 首先&#xff0c;确保你有远程数据库的以下信息&#xff1a; 主机名&#xff08;Host&#xff09;&#xff1a;通常是服务器的 IP 地址或域…

mysql把某一个字段的值中的aa,替换成bb

UPDATE my_table SET my_column REPLACE(my_column, aa, bb); 例 假设my_table表在替换前的数据如下&#xff1a; idmy_column1hello aa2world aa aa3no aa here 执行上述UPDATE语句后&#xff0c;my_table表的数据将变为&#xff1a; idmy_column1hello bb2world bb b…

vulnhub靶机:Holynix: v1

下载 下载地址&#xff1a;https://www.vulnhub.com/entry/holynix-v1,20/ 打开虚拟机 选择下载解压之后的文件打开 新添加一张 NAT 网卡&#xff0c;mac 地址修改如下 00:0c:29:bc:05:de 给原来的桥接网卡&#xff0c;随机生成一个 mac 地址 然后重启虚拟机 信息收集 主…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

10.索引下推

10.索引下推 10.1.什么是索引下推&#xff1f; &#xff08;1&#xff09;索引下推 (Index Condition Pushdown, ICP) 是 MySQL 5.6 中新特性&#xff0c;是一种在存储引擎层使用索引过滤数据的一种优化方式。 &#xff08;2&#xff09;如果没有 ICP&#xff0c;存储引擎会遍…

设计模式---中介者模式

设计模式---中介者模式 定义与设计思路中介者模式的引入&#xff1a;机场控制塔中介者模式的设计框架 定义与设计思路 定义&#xff1a;用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间…

CISP-PTE CMS sqlgun靶场

sql靶场有个搜索框先点一下go&#xff0c;有回显说明存在漏洞 有个xss 然后在这里尝试sql注入 输入 -1 union select 1,2,3# 有回显可以查看数据库 然后查询数据库&#xff0c;用户 查询数据库的表名 查询它的数据这里admin用户的密码是md5加密 去解密看看 然后扫描ip目录发…

【ShuQiHere】 进位回补与溢出问题全解:二补码与一补码的进阶指南

【ShuQiHere】 在现代计算机系统中&#xff0c;数值运算的准确性和效率至关重要。无论是整数的加法还是减法&#xff0c;在处理负数、符号位和进位问题时&#xff0c;都可能遇到 进位回补&#xff08;End-Around Carry&#xff09; 和 溢出&#xff08;Overflow&#xff09; 等…