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

news2024/11/25 10:44:36

文章目录

  • 前言
  • 一、为什么会发生重复点击
  • 二、针对以上问题怎么处理
    • 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、将用户点击反馈和按钮禁用结合使用


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务百万商家的系统,发布风险如何规避?微盟全链路灰度实践

一分钟精华速览 全链路灰度发布是指在微服务体系架构中&#xff0c;应用的新、旧版本间平滑过渡的一种发布方式。由于微服务之间依赖关系错综复杂&#xff0c;一次发布可能会涉及多个服务升级&#xff0c;所以在发布前进行小规模的生产环境验证&#xff0c;让新版本的应用实例…

锂电材料浆料匀浆搅拌设备轴承经常故障如何处理?

锂电材料浆料匀浆搅拌设备是锂电池生产中重要的设备之一&#xff0c;用于将活性材料、导电剂、粘结剂和溶剂混合成均匀的浆料&#xff0c;是电极制备过程中不可或缺的步骤。然而&#xff0c;由于高速搅拌和化学腐蚀等因素的影响&#xff0c;轴承经常会出现故障&#xff0c;导致…

Java基础部分面试题(2023最新)

一、Java概述 1. 谈谈你对 Java 平台的理解&#xff1f; ① 平台无关性&#xff08;一次编译到处运行&#xff09; ② GC&#xff08;垃圾自动回收机制&#xff0c;不像C那样需要手动去释放堆内存&#xff09; ③ 语言特性&#xff08;泛型、反射、Lambda 表达式&#xff09; …

Dubbo 简易环境搭建以及使用(2)

目录 环境搭建 Dubbo的3种使用方式&#xff1a; 1. XML配置的方式&#xff0c;一般用于Spring MVC工程 2. 配置文件的方式 &#xff08;spring boot工程&#xff09; 3. 注解方式 Dubbo 控制台 环境搭建 本篇将介绍Spring boot zookeeper Dubbo 简易环境的搭建以及使用…

同等学力申硕如何择校?

我们常常会在一些艰难选择面前不知所措&#xff0c;比如说不知道选择什么样的院校学习&#xff0c;不知道选择什么样的专业学习&#xff0c;不知道同等学力申硕的具体过程&#xff0c;不知道这个过程中你要付出多大的代价&#xff0c;更不知道学习中的一些关键环节等&#xff0…

飞利浦水健康携净水新品重磅亮相AWE2023

2023年度中国家电及消费电子博览会&#xff08;AWE2023&#xff09;于4月27日在上海新国际博览中心正式开幕。其中&#xff0c;飞利浦水健康携全屋高阶净水G5系列、厨下净水器U22Pro、冰热矿净四合一台式净饮机等新品悉数亮相&#xff0c;在暌违2年的AWE舞台上&#xff0c;为行…

垃圾分类算法训练及部署

垃圾分类算法训练及部署 创建模型与编译模型训练及保存模型生成模型应用 创建模型与编译 数据加载进模型后定义模型结构&#xff0c;并优化损失函数。直接调用VGG-16模型作为卷积神经网络&#xff0c;包括13个卷积层、3个全连接层、5个池化层&#xff0c;后接全连接层&#xf…

终于把 vue-router 运行原理讲明白了(一)!!!

一、vue-router 用法 1.1 首先我们需要在我们的项目中&#xff0c;下载vue-router&#xff0c;我在项目中使用的是3.x版本 1.2 在项目中引入&#xff0c;并实例化路由实例&#xff0c;贴代码如下 1.3 下面代码有两个重点部分&#xff0c;等在第三部分具体分析 &#xff08;1&a…

FAMI-Pose训练

之前写过FAMI-Pose的论文解析&#xff0c;最近跑了一下官方代码&#xff0c;链接是&#xff1a;FAMI-Pose&#xff0c;但有很多问题&#xff0c;感觉是不是作者上传错了。这篇博客讲一下FAMI-Pose的训练。 运行 首先&#xff0c;安装环境&#xff0c;这个根据官方requirement…

NTT入门 开拓者的卓识

link 大意&#xff1a; 给定一个长度为n的数组a&#xff0c;求[1,n]的k阶子段和 我们定义k阶子段和如下&#xff1a; 思路&#xff1a; 这个k阶字段和&#xff0c;就是在k-1阶的基础上&#xff0c;再讲所有k-1阶的子段和都相加得到k阶子段和 k是很大的&#xff0c;所以我…

【C++学习】unordered_map和unordered_set的使用和封装

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; unordered_map和unordered_set &#x1f9e2;unordered_map/set&#x1f52e;性能比较&#x1f52e;成…

Python采集二手车数据信息实现数据可视化展示

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用&#xff1a; Python 3.8 Pycharm 专业版是付费的 <文章下方名片可获取魔法永久用~> 社区版是免费的 模块使用&#xff1a; 第三方模块 需要安装的 requests >>> pip install requests p…

分享5款让生活和工作变得更加高效的软件

随着科技的发展,我们的生活和工作变得越来越数字化和自动化。许多实用软件应运而生,它们不仅简化了我们的生活,也使工作变得更加高效。这里我们来介绍5款非常实用的软件工具。 1.安全擦除工具——Secure Eraser Secure Eraser是一款可以安全删除数据的工具&#xff0c;它使用…

基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁&#xff08;tongsuo&#xff09;开源基础密码库实现前端对用户登录密码的加密&#xff0c;从而实现前端隐私数据的保密性。 首先&#xff0c;铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;在中国商用密码算法&#xff0c;例…

京东T7架构师用470页就把微服务架构原理与开发实战文档讲完了

前言 最近几年软件开发方法层出不穷&#xff0c;微服务作为一种主流的架构模式一直热度不减。 为了帮助广大程序员们更好更快地理解微服务的概念&#xff0c;学习微服务在项目中的实践&#xff0c;本文全面阐述了微服务架构模式的特点、架构思路、设计理念、技术框架及具体的…

根据cadence设计图学习硬件知识day07 了解一些芯片

1.LC0502N &#xff08;ESD静电保护元件&#xff09; 1.1 LC0502N 介绍 应用 ● USB 2.0电源和数据线 ● 机顶盒和数字电视 ● 数字视频接口&#xff08;DVI&#xff09; ● 笔记型电脑 ● SIM端口 ● 10/100以太网 1.2 LC0502N 引脚介绍 &#xff08;无语&#xff0…

1。C语言基础知识回顾

学习嵌入式的C基础知识&#xff0c;主要包括几个核心知识点&#xff1a;三大语法结构、常用的数据类型、函数、结构体、指针、文件操作。 一、顺序结构 程序自上而下依次执行、没有分支、代码简单。 常见顺序结构有&#xff1a;四则运算&#xff1a;&#xff0c;-&#xff0…

通达信顾比倒数线指标公式,信号不漂移

顾比倒数线是由技术派大师戴若顾比发明的&#xff0c;该指标利用三个重要的价格来判断入场或离场时机&#xff0c;可用于盘后制定下一个交易日的操作计划。此外&#xff0c;顾比倒数线还可以用于补充验证其他指标。 在编写顾比倒数线选股公式之前&#xff0c;需要先了解顾比倒…

vue3之vite创建h5项目之2 (sass公共样式、声明组件、路由配置和layout组件 )

目录 vue3之vite创建h5项目之2 &#xff08; &#xff09;1&#xff1a;安装sass1-1 使用sass引入公共样式11-1-1 main.ts 引入公共样式方式 1-2 vite.config.ts 引入公共样式方式21-3样式文件1-3-1 src / style / index.scss ( 适配iphonex等还有引入其他公共的样式 )1-3-2 sr…

CRM部署Always on 后 CRM报无法更新数据库,数据库只读,且读写分离不正常

CRM部署Always on 后 CRM报无法更新数据库&#xff0c;数据库只读&#xff0c;读写分离不正常 问题描述背景信息问题原因解决方案 问题描述 CRM部署Always on 后 CRM报无法更新数据库&#xff0c;数据库只读 读写分离不正常,出现错乱链接。 背景信息 1.2个节点配置SQL serve…