小程序按钮重复点击解决方案

文章目录

  • 前言
  • 一、为什么会发生重复点击
  • 二、针对以上问题怎么处理
    • 1、分析解决方法:
    • 1. 反馈
    • 2.禁用
  • 三、最优解决
  • 总结


前言

小程序是直面用户便捷的应用,而在用户使用时往往都会涉及到关键节点的按钮点击,例如,注册登录时,页面跳转时,发送验证码时,付钱还款,弹出提示等等。。。如果没有控制好按钮重复点击的问题,那么影响用户体验。当然有时候也会被同行吐槽,这人不行。。。


一、为什么会发生重复点击

1、点击按钮后有网络请求,请求有时长。此时用户可能在网络请求成功前,再次点击按钮。
2、点击按钮后没有给到用户好的反馈效果,用户以为没有点击到,或者没有点击成功。
3、手机发生卡顿,应用性能下降,点击按钮事件实际已经触发,但是没有反馈效果,用户再次点击。

二、针对以上问题怎么处理

1、分析解决方法:

1、当用户点击按钮后,给到用户点击反馈。
2、当用户点击按钮后,禁用按钮,不可再次点击。

1. 反馈

当触发按钮点击事件,并且关联重要网络请求,需要给出反馈,以下举例集中反馈方法。
1、按钮loading
直接利用小程序按钮组件提供的loading属性,动态控制按钮loading效果

<template>
	<view class="content">
		<button @tap="dianJi" :loading="isClick">
			点击-{{!isClick ? "可以点击" : "不可以点击"}}
		</button>
	</view>
</template>

<script setup>
	import {
		ref
	} from "vue"
	let isClick = ref(false)
	const dianJi = () => {
		isClick.value = true
		setTimeout(()=>{
			isClick.value = false
		}, 2000)
	}
</script>

在这里插入图片描述

2、页面loading
利用uni.showLoading api完成

<template>
	<view class="content">
		<button @tap="dianJi">
			点击-{{!isClick ? "可以点击" : "不可以点击"}}
		</button>
	</view>
</template>

<script setup>
	import {
		ref
	} from "vue"
	let isClick = ref(false)
	const dianJi = () => {
		uni.showLoading({
			mask: true,
			title: "请稍候"
		})
		isClick.value = true
		setTimeout(()=>{
			isClick.value = false
			uni.hideLoading()
		}, 2000)
	}
</script>

3、点击效果样式变化
利用组件提供属性,设置点击改变背景颜色

<template>
	<view class="content">
		<button @tap="dianJi" hover-class="isClickStyle">
			点击-{{!isClick ? "可以点击" : "不可以点击"}}
		</button>
	</view>
</template>
<script setup>
	import { ref } from "vue"
	let isClick = ref(false)
	const dianJi = () => {
		isClick.value = true
		setTimeout(()=>{
			isClick.value = false
		}, 2000)
	}
</script>
<style>
	.isClickStyle {
		background-color: aquamarine;
	}
</style>

当然你也可以用伪类选择器设置颜色-当然还是建议使用官方提供的属性来设置,毕竟不会有问题

<style>
	button:active {
		background-color: aqua;
	}
</style>

在这里插入图片描述

4、toast提示
只需用到uni api 就可以实现更多用法可以参考文档

uni.showToast({
	title: '点击'
})

在这里插入图片描述

2.禁用

当触发按钮点击事件时,禁用按钮,不可点击。
1、禁用按钮disabled
功能描述: 点击按钮控制标识,动态控制disabled属性。

<template>
	<view class="content">
		<button
		 @tap="dianJi"
		 :disabled="!isClick"
		>
		 点击-{{isClick ? "可以点击" : "不可以点击"}}
		</button>
	</view>
</template>

<script setup>
import { ref } from "vue"
let isClick = ref(true)
const dianJi = () => {
	isClick.value = false
	// 模拟异步请求
	setTimeout(() => {
		isClick.value = true
	}, 2000);
};
</script>

2、点击样式控制pointer-events
功能描述: 点击按钮控制标识,动态控制css样式pointer-events属性。

<template>
	<view class="content">
		<button
		 @tap="dianJi"
		 :style="{'pointer-events': isClick ? 'auto' : 'none'}"
		>
		 点击-{{isClick ? "可以点击" : "不可以点击"}}
		</button>
	</view>
</template>

<script setup>
import { ref } from "vue"
let isClick = ref(true)
const dianJi = () => {
	isClick.value = false
	// 模拟异步请求
	setTimeout(() => {
		isClick.value = true
	}, 7000);
};
</script>

4、js控制标识阻止代码执行

<template>
	<view class="content">
		<button
		 @tap="dianJi"
		>
		 点击-{{isClick ? "可以点击" : "不可以点击"}}
		</button>
	</view>
</template>

<script setup>
import { ref } from "vue"
let isClick = ref(true)
const dianJi = () => {
	if (!isClick.value) {
		return
	}
	isClick.value = false
	// 模拟异步请求
	setTimeout(() => {
		isClick.value = true
	}, 2000);
};

5、节流防抖–具体代码讲解应该很熟悉了,就不讲解了
防抖

let timeout;
function debounce(func, wait, immediate) {
	return function() {
		let context = this;
		let args = arguments;
		if (timeout) clearTimeout(timeout); 
		if (immediate) {
			let callNow = !timeout; 
			timeout = setTimeout(function() {
				timeout = null;
			}, wait)
			if (callNow) {
				func.apply(context, args)
			}
		} else {
			timeout = setTimeout(function() {
				func.apply(context, args)
			}, wait);
		}
	}
}

节流

let timer = null
function throttled(fn, delay) {
	let starttime = Date.now()
	return function() {
		let curTime = Date.now() 
		let remaining = delay - (curTime - starttime) 
		let context = this
		let args = arguments
		clearTimeout(timer)
		console.log(65654645, remaining <= 0)
		if (remaining <= 0) {
			fn.apply(context, args)
			starttime = Date.now()
		} else {
			timer = setTimeout(fn, remaining);
		}
	}
}

三、最优解决

1、将用户点击反馈和按钮禁用结合使用


总结

如有问题欢迎指出,如果有其他办法欢迎评论指导学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【技术】《Netty》从零开始学netty源码(四十八)之缓存池ObjectPool

目录 ObjectPool创建对象池获取对象get()从本地池中获取对象claim()回收对象 ObjectPool 在分析PooledByteBuf的时候我们遇到了recycleHandler类&#xff0c;该类用于回收已经使用完毕的缓存对象并将其放回池中供下次循环利用&#xff0c;Netty的对象池工作过程大体如下&#…

vulnhub靶机Misdirection

环境准备 下载链接&#xff1a;https://download.vulnhub.com/misdirection/Misdirection.zip 解压后双击ovf文件导入虚拟机 网络&#xff1a;DHCP、NAT、192.168.100.0/24网段 信息收集 主机发现 192.168.100.133是新增的ip 端口扫描 发现开放了以上端口&#xff0c;继续…

ChatGPT之父:未训练GPT-5

GPT等大型语言模型带动的芯片需求飙升趋势依然没有平息的迹象&#xff0c;英伟达的最新版旗舰AI芯片H100近日在网上的售价已经被炒到4万多美金&#xff0c;反映了科技行业对训练和部署人工智能软件的需求仍未被满足。 一、商业圈 1.马斯克成立新AI公司硬刚OpenAI 当地时间4月…

c++ 11标准模板(STL) std::vector (二)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

如何使用递归函数实现Excel列号转换列标

在Excel中&#xff0c;列标与列号转换是VBA开发过程中经常用到的功能&#xff0c;下面这篇博客为大家解释了多种方法。 【Excel列标与列号转换】 那么这篇博文的核心是“递归过程”&#xff0c;实现这个功能并不是必须使用递归过程&#xff0c;但是这也不失为一种实现方法&am…

JavaScript实现输入圆的半径,输出周长、体积和面积的代码

以下为输入圆的半径,输出周长、体积和面积实现结果的代码和运行截图 目录 前言 一、请输入圆的半径,输出周长、体积和面积 1.1运行流程及思想 1.2代码段 1.3 JavaScript语句代码 1.4运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博…

03 KVM虚拟机镜像制作

文章目录 03 KVM虚拟机镜像制作3.1 概述3.2 制作镜像3.2.1 使用root用户安装qemu-img软件包3.2.2 使用qemu-img工具的创建镜像文件 3.3 修改镜像磁盘空间大小3.3.1 查询当前虚拟机镜像磁盘空间大小3.3.2 修改镜像磁盘空间大小3.3.3 查询修改后的镜像磁盘空间大小 03 KVM虚拟机镜…

【HTML 标签详解】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f9be;&#x1f9be;&#x1f9be; 目录 1. HTML结构 1.1 HTML 基本结构 1.2 标签层…

DBeaver 没有菜单项 生成SQL Generate SQL

文章目录 Intro问题的根本有无该菜单项取决于你的查询SQL是单表还是多表&#xff1f;单表查询的结果集的菜单多表关联查询的结果集的菜单 测试版本 Intro DBeaver 是一款很棒的多平台、支持多数据源的GUI数据库客户端。 有一个我经常使用的功能就是&#xff1a; 当我查询到一个…

Linux内核阅读自学精简教程目录(必读)

学习Linux内核需要一定的计算机基础知识&#xff0c;包括操作系统&#xff0c;计算机网络等。 以下是学习Linux内核的步骤&#xff1a; 了解Linux内核的基本概念和架构&#xff0c;学习Linux内核源代码的组成和结构。学习C语言和汇编语言&#xff0c;这是深入理解Linux内核的…

界面控件DevExpress WinForm的垂直网格,让数据展示更灵活(二)

DevExpress WinForm Vertical Grid&#xff08;垂直网格&#xff09;组件设计用于提供UI灵活性&#xff0c;它允许显示数据集中的单个行&#xff0c;或在其90度反向网格容器中显示多个数据集行。此外&#xff0c;开发者还可以将其用作属性网格&#xff0c;就像在Visual Studio …

Python使用pytorch深度学习框架构造Transformer神经网络模型预测红酒分类例子

1、红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本&#xff0c;每个样本有13个特征&#xff0c;可以用于分类任务。 具体每个字段的含义如下&#xff1a; alcohol&#xff1a;酒精含量百分比 malic_acid&#xff1a;苹果酸含量&a…

用手机APP操作使用井用采样器更省时省力

井用采样器的主要功能特点就是&#xff1a;机身小巧&#xff0c;方便操作。可用于井下作业&#xff0c;手机APP可实时查看采样数据&#xff0c;节省人力。 利用自动采样器进行水样采集可以说节省很大的人力物力&#xff0c;但是有时为了采到更具代表性的水样&#xff0c;我们需…

JAVA-6-[Spring框架]Bean的作用域和生命周期

1 Spring Bean 1、Spring有两种类型bean&#xff0c;一种普通bean&#xff0c;另外一种工厂bean(FactoryBean)。 2、普通bean&#xff1a;在配置文件中定义的bean类型就是返回的类型。 3、工厂bean&#xff1a;在配置文件中定义的bean类型可以和返回类型不一样。 第一步 创建类…

React超级简单易懂全面的有关问题回答(面试)

目录 React事件机制&#xff1a; 2、React的事件和普通的HTML有什么不同&#xff1a; - 事件命名的规则不同&#xff0c;原生事件采用全小写&#xff0c;react事件采用小驼峰 3、React组件中怎么做事件代理&#xff1f;他的原理是什么&#xff1f; 4、React高阶组件、Rend…

mysql 如何避免索引失效

案例演示 建表及初始化数据 CREATE TABLE staffs (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(24) NOT NULL DEFAULT ,age INT NOT NULL DEFAULT 0,pos VARCHAR(20) NOT NULL DEFAULT ,#职位add_time TIMESTAMP NOT NULL DEFAULT CURREN…

【源码解析】SpringBoot日志系统源码分析

LoggingApplicationListener 日志组件的处理是LoggingApplicationListener实现的。LoggingApplicationListener#onApplicationEvent&#xff0c;监听事件。如果实现接口GenericApplicationListener&#xff0c;可以允许适配事件类型。 private static final Class<?>[]…

链接sqlite

一.sqlite库函数 1.sqlite3_open()函数 语法&#xff1a;*sqlite3_open(const char *filename, sqlite3 *ppDb) 作用&#xff1a;该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。 参数1&#xff1a;如果 filename …

8个免费的PNG素材网站推荐

很多设计小白都不知道什么是PNG。事实上&#xff0c;PNG是一种支持透明度的图像格式。当你想在设计中将图像与背景或文本混合时&#xff0c;它就会派上用场。 如果你没有时间为你正在处理的设计创建透明的PNG图像&#xff0c;你也可以使用我收集的PNG素材网站&#xff0c;以便…

Mysql-SQL优化

SQL优化 插入数据优化1&#xff09;批量插入数据2&#xff09;手动控制事务3&#xff09;主键顺序插入大批量插入数据 主键优化order by优化group by优化limit优化count优化update优化小结 插入数据优化 插入数据优化主要是对于insert进行批量插入时优化&#xff0c;下面我们就…