React Native防止重复点击
项目中遇到了点击按钮重复提交的问题,防止重复点击首先是想到的是给点击事件一个定时,下次触发的条件是要距离上一次点击的时间大于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;
}
有好的思路欢迎评论交流
相关文章:

React Native防止重复点击
项目中遇到了点击按钮重复提交的问题,防止重复点击首先是想到的是给点击事件一个定时,下次触发的条件是要距离上一次点击的时间大于N秒的之后才能再执行。 // 防重复点击函数 export const preventRepeatPress {lastPressTi1me: 0, // 上次点击时间…...

如何将Git本地代码推送到Gitee云端仓库
如何将Git本地代码推送到Gitee云端仓库 在使用Git进行版本控制时,将本地代码推送到远程仓库是一个基本且重要的操作。本文将详细介绍如何将你的Git本地代码推送到Gitee(码云)云端仓库。Gitee是一个国内非常流行的代码托管平台,类…...

架构师论文备考-论云原生架构及其应用
摘要 2022年3月,我有幸参与了公司的新智慧公交系统的研发工作。该系统基于B/S架构设计,并以多租户SaaS平台化为发展目标,旨在创建一个功能更全面、性能更卓越、稳定性更强、用户体验更佳的公交调度一体化平台。在这一项目中,我主要…...

12.java面向对象:java构造器
构造器 一个类即使什么都不写,也会存在一个方法。 假如我创建了一个类叫Student里面什么都不写,然后使用StudentDemo创建对象,运行没有结果,也没有报错。 public class Student {}public class StudentDemo {public static voi…...

微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。如果没有适当的安全机制,微服务系统可能会暴露在各种网络攻击和安全漏洞中。本文将讨论几种常见的微服务间安全…...

全面掌握 Jest:从零开始的测试指南(下篇)
在上一篇测试指南中,我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性,包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…...

如何利用UML进行领域建模
如何利用UML进行领域建模 领域建模是通过创建抽象模型来反映业务领域中的核心概念、实体及其之间的关系。UML(统一建模语言)是进行领域建模的常用工具,它能帮助我们可视化地设计系统架构和业务逻辑。在这篇讲解中,我们将详细解释…...

Vue实用操作篇-1-第一个 Vue 程序
安装 Vue 非常的简便,只需下载好 Vue 对应的 .js 文件,在 html 中引入 vue.js 即可使用 Vue 下载好了 vue.js 我们便可以编写我们的第一个 vue 程序了 <!doctype html> <html lang"zh-CN"><head><meta charset"utf…...

Qwen2-VL的微调及量化
一、Qwen2-VL简介 Qwen2-VL是Qwen-VL的升级版本,能力更强,性能全面提升。尤其是72B参数的版本更是取了惊人的成绩。它可以读懂不同分辨率和不同长宽比的图片,在 MathVista、DocVQA、RealWorldQA、MTVQA 等基准测试创下全球领先的表现…...

[数据集][目标检测]车窗状态检测车窗开关检测数据集VOC+YOLO格式299张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):299 标注数量(xml文件个数):299 标注数量(txt文件个数):299 标注类别…...

自动泊车系统中的YOLOv8 pose关键点车位线检测
自动泊车系统中的YOLOv8关键点车位线检测技术解析 引言 随着智能驾驶技术的快速发展,自动泊车功能成为了现代汽车的重要组成部分。它不仅能够提高驾驶的安全性,还能在一定程度上解决城市停车难的问题。在自动泊车系统中,准确识别停车位的位置…...

Java html生成pdf和图片
在 Java 项目中将 HTML 生成图片是一项常见需求,特别是用于生成报告、预览页面截图等。不同的库和工具在渲染能力、性能以及支持的功能上有所不同。以下是几种主流的技术选型和对比,帮助你选择适合的解决方案。 技术对比总结 技术名称优点缺点适用场景…...

JavaWeb笔记整理——Redis
目录 Redis数据类型 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在Java中操作Redis Spring Data Redis的使用方式 操作字符串类型的数据 编辑操作hash类型的数据 编辑 操作列表类…...

数据库(mysql)常用命令
一.常见的数据库端口号 Mysql默认端口:3306 oracle 默认端口:1521 Sql server 默认端口:1433 注:Mysql采用 的是C/S(客户端/服务器端)架构 二.sql 语法基础 服务器,数据库,数据表,记录,字段之间的关系: 一台Mysql服务器可以管理多个数据库 一个数据库可以存在多张二维表…...

源网荷储一体化新型电力系统解决方案
风光装机快速增长,加剧电力系统不可控性。截至2023H1,我国风电装机389.21GW,太阳能装机470.67GW,风光合计占总装机的31.76%。其中,2023年H1我国风电新增装机22.99GW,对比22年同期新增12.94GW,同…...

树莓派安装 OpenCV 教程
以下是在树莓派上安装 OpenCV 的教程: 笔者当前Python版本:3.7.3 一、更新树莓派系统 在终端中运行以下命令: sudo apt update sudo apt upgrade二、安装必要的依赖项 安装构建工具和图像 I/O 库: sudo apt install build-e…...

01,大数据总结,zookeeper
1 ,zookeeper :概述 1.1,zookeeper:作用 1 ,大数据领域 :存储配置数据 例如:hadoop 的 ha 配置信息,hbase 的配置信息,都存储在 zookeeper 2 ,应用领…...

伪工厂模式制造敌人
实现效果 1.敌人方实现 敌人代码 using UnityEngine; using UnityEngine.UI;public class EnemyBasics : MonoBehaviour {public int EnemySpeed { get; internal set; }public int EnemyAttackDistance { get; internal set; }public int EnemyChaseDistance { get; interna…...

【linux】pwd命令
pwd 命令在 Linux 和类 Unix 系统中用于显示当前工作目录的完整路径。它是 "print working directory" 的缩写。 当你在终端或命令行界面中工作时,你可能会在不同的目录(或文件夹)之间切换。pwd 命令帮助你确定你当前位于哪个目录…...

Python 如何封装工具类方法,以及使用md5加密
第一步:封装使用方法 在utils目录中,编写我的md5加密的方法,如下: import re import hashlib from os import path from typing import Callable from flask import current_app# 这里封装的是工具类的方法def basename(filenam…...

网络编程的应用
目录 1.单机程序和网络程序 2.客户端与服务端 3.网络编程三要素 3.1 IP地址 3.2 port端口 4.TCP编程 5.UDP编程 1.单机程序和网络程序 之前编写的程序都是单机程序,所有的业务功能实现及数据存储都在一个主机上完成,我们称为单机程序 我们在生活…...

佰朔资本:国内海风加速招标 船舶行业景气上行
昨日,沪指盘中一度下探失守2700点,尾盘在地产、银行等板块的带动下发力上扬,深证成指亦翻红。到收盘,沪指涨0.49%报2717.28点,深证成指涨0.11%报7992.25点,创业板指跌0.11%报1533.47点,上证50指…...

理解AAC和Opus的编码与解码流程
理解AAC和Opus的编码与解码流程及其在Android中的实现,对于音频开发非常重要。下面,我将详细解释这两种编码格式的原理、流程,并结合具体代码示例,帮助你在Android项目中合理地设计和使用它们。 一、AAC(Advanced Audio Coding) 1. AAC的原理与流程 AAC是一种有损音频压…...

设计图纸加密方法知多少?小编给你讲清楚
一、对称加密 使用对称加密算法,对设计图纸进行加密。对称加密使用相同的密钥进行加密和解密,确保只有持有正确密钥的人能够解密文件。 二、非对称加密 使用非对称加密算法,进行设计图纸的加密。非对称加密使用公钥加密、私钥解密的方式&a…...

pycv实时目标检测快速实现
使用python_cv实现目标实时检测 python 安装依赖核心代码快速使用实现结果展示enjoy python 安装依赖 opencv_python4.7.0.72 pandas1.5.3 tensorflow2.11.0 tensorflow_hub0.13.0 tensorflow_intel2.11.0 numpy1.23.5核心代码快速使用 # 使用了TensorFlow Hub和OpenCV库来实…...

记录下如何让字体在div内 自动换行 上下居中
div内样式 display: flex; // flex布局 justify-content: center; // 上下居中 align-items: center; // 左右居中 overflow-wrap: break-word; // 允许字体换行 (若行内的单词无法放下则换行) word-break: break-all; // 强制文本在任意字符间进…...

Shell篇之编写MySQL启动脚本
Shell篇之编写MySQL启动脚本 1. 脚本内容 vim mysql_ctl.sh#!/bin/bashmysql_port3306 mysql_username"root" mysql_password"molinker" mysql_conf"/opt/lanmp/mysql/etc/my.cnf" mysql_sock"/opt/lanmp/mysql/var/mysql.sock"func…...

supermap Iclient3d for cesium加载地形并夸大地形
先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…...

一文解读OLAP的工具和应用软件
OLAP(OnlineAnalyticalProcessing)是一种用于快速分析大规模、多维度数据的方法。OLAP工具和应用软件则是帮助人们进行OLAP分析的重要工具。本文将介绍几种常见的OLAP工具和应用软件,并探讨它们在数据分析中的作用。 一 OLAP工具的分类 在选…...

xml重点笔记(尚学堂 3h)
XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…...