微信小程序:限制表单多次提交(变量限制+防抖)

ops/2024/9/23 7:27:58/

方法一:变量限制

设置一个变量,在提交表单前设置为false,当表单开始提交时设置为true(禁用按钮),成功请求或者失败再设置为false

代码

wxml

<form bindsubmit="formSubmit"><view class="section"><input placeholder="请输入姓名" name="username" /></view><view class="section"><input type="password" placeholder="请输入密码" name="password" /></view><button form-type="submit">提交</button>
</form>

js

const app = getApp()
Page({data: {isSubmitting: false, // 新增一个表示是否正在提交的状态},formSubmit: function(e) {if (this.data.isSubmitting) return; // 如果正在提交,则不再处理新的提交请求// 设置为正在提交状态this.setData({ isSubmitting: true }); const forminfo = e.detail.value;console.log(forminfo.username+"|"+forminfo.password)//发送请求wx.request({url: app.globalData.position + 'Produce/test',data: {username: forminfo.username,password:forminfo.password},header: {"Content-Type": "application/x-www-form-urlencoded"},method: 'POST',dataType: 'json',success: res => {console.log(res.data)this.setData({ isSubmitting: false }); // 请求成功后重置提交状态wx.reLaunch({url: '/pages/mine/index/index',})},fail(res) {console.log("查询失败")this.setData({ isSubmitting: false }); // 请求失败后也要重置提交状态}})}
})

方法二:防抖功能

节流(Throttling)和防抖(Debouncing)是两种不同的事件处理优化技术,主要用于限制函数被频繁调用,常用于处理那些高频触发但不需要连续响应的事件,比如窗口 resize、scroll 事件,以及表单提交等场景。
防抖 (Debouncing):
        防抖是指在一个事件持续触发的过程中,只有当这个事件停止触发一段时间后再执行回调函数的操作。举个例子,在监听窗口 resize 事件时,我们不希望在用户连续调整窗口大小的过程中不断触发重绘计算,而是等到用户停止调整尺寸(即一定时间间隔内无新触发)后再执行一次计算。这样可以有效地合并多次操作,减少不必要的计算。
        实现原理: 想象一下按住开关灯会一直闪烁的情景,防抖就像是松开开关后才允许灯亮起,只要手还在按着,不管按了多少次,灯都不会再次亮起,除非松开手并等待一定时间后再次按下。
节流 (Throttling):
        节流则是指在一定时间内无论事件如何触发,都会按照一定的频率执行回调函数,保证了在一段时间内只会被执行一次。这意味着,即使事件连续触发,也会有一定的最小时间间隔来执行回调函数。
        实现原理: 同样以开关灯为例,节流就像是定时开关,即使你快速反复地按开关,灯也只会按照固定的频率(比如每秒钟开关一次)进行切换。
这两种策略在实际应用中可以根据需求选择合适的解决方案。在处理表单提交时,通常采用防抖策略来确保用户在提交按钮被点击后的一段时间内不会重复提交表单;而在滚动事件等场景下,可能更倾向于采用节流策略,确保在用户滚动过程中定期执行某项操作,而不是在滚动停止后再执行。

代码

wxml

<form bindsubmit="formSubmit"><view class="section"><input placeholder="请输入姓名" name="username" /></view><view class="section"><input type="password" placeholder="请输入密码" name="password" /></view><button form-type="submit">提交</button>
</form>

 js

const app = getApp()
Page({data: {isSubmitting: false,submitTimeoutId: null,},// 自定义防抖函数debounceFn(func, delay) {let timer = null;return function(...args) {if (timer) {clearTimeout(timer);}timer = setTimeout(() => {func.apply(this, args);timer = null;}, delay);};},onLoad: function() {// 页面加载完成后初始化防抖处理的表单提交方法this.formSubmitWrapper = this.debounceFn(this.actualFormSubmit, 1000);},actualFormSubmit: async function(e) {if (this.data.isSubmitting) return;this.setData({isSubmitting: true,});const forminfo = e.detail.value;console.log(forminfo.username + "|" + forminfo.password);try {const response = await promisifyRequest({url: app.globalData.position + 'Produce/test',data: {username: forminfo.username,password: forminfo.password,},header: {"Content-Type": "application/x-www-form-urlencoded",},method: 'POST',dataType: 'json',});console.log(response.data);this.setData({ isSubmitting: false });wx.reLaunch({url: '/pages/mine/index/index',});} catch (error) {console.error("查询失败", error);this.setData({ isSubmitting: false });}},formSubmit: function(e) {this.formSubmitWrapper(e);},
});// 将wx.request转换为Promise的形式,用于配合async/await语法
function promisifyRequest(options) {return new Promise((resolve, reject) => {wx.request({...options,success: resolve,fail: reject,});});
}


http://www.ppmy.cn/ops/2436.html

相关文章

一篇文章厘清C#中的lambda表达式

一篇文章厘清C#中的lambda表达式 链接: 源码 说C#的匿名函数,就要先说一下匿名函数. Lambda表达式 1 lambda表达式演变史1. **C# 1.0 (2002)**2. **C# 2.0 (2005)**3. **C# 3.0 (2007)**4. **C# 4.0及以后** 2 lambda表达式使用方法1 **基本语法**2 **使用场景和示例****作为…

设计模式之备忘录模式(下)

3&#xff09;实现多次撤销 1.结构图 对负责人类MementoCaretaker进行了修改&#xff0c;在其中定义了一个ArrayList类型的集合对象来存储多个备忘录。 2.代码实现 import java.util.*;public class MementoCaretaker {//定义一个集合来存储多个备忘录private ArrayList mem…

关于java数据样品以及转换

关于集合 List<String> List<String> list duoMapper.selectName(); [ "alice1", "alice2", "alice3", "alice4", "alice5", "alice6", "alice7", "alice8",…

Discourse API 调用数据返回的问题

在我们调用 Discourse API 创建一个主题的时候&#xff0c;我们会从 Discourse API 的调用文档中看到返回的 thumbnails 返回为 String。 但实际上 thumbnails 的返回在目前已经是一个对象了。 根据实际返回的结果&#xff0c;这个字段已经被设置成了一个 List。 真实的服务器…

【原创教程】EPLAN电气图纸设计规范

EPLAN电气图纸中的通用说明&#xff0c;说白了就是电气图纸的图纸概述、制图规范&#xff08;这里的规范根据每个公司及客户的要求不同进行更改&#xff09;。下面就以我们公司的规范要求&#xff0c;以实际的项目案例来对照讲述一下&#xff0c;通用说明的制作。 1.首先新建页…

界面控件DevExpress WinForms/WPF v23.2 - 富文本编辑器支持内容控件

众所周知内容控件是交互式UI元素(文本字段、下拉列表、日期选择器)&#xff0c;用于在屏幕上输入和管理信息。内容控件通常在模板/表单中使用&#xff0c;以标准化文档格式和简化数据输入。DevExpress文字处理产品库&#xff08;Word Processing Document API、WinForm和WPF富文…

详解App Inventor 2 中的文件作用域(作用范围):App、程序包、缓存、兼容、私有、共享

本文内容来自中文网文档“文件管理器”组件部分&#xff0c;详细介绍了每一种文件作用域的特点及用法。 下面是每种作用域类型的简述&#xff1a; App [推荐] &#xff1a;Android 2.2及更高版本上文件将从应用程序特定存储中读取和写入&#xff0c;在 Android 早期版本上&…

ChatGPT助力:写作步步高

ChatGPT无限次数:点击直达 html ChatGPT助力&#xff1a;写作步步高 引言 在当今信息爆炸的时代&#xff0c;写作作为一种重要的表达方式&#xff0c;扮演着不可或缺的角色。然而&#xff0c;随之而来的挑战是如何保持高质量的创作并不断提升写作水平。本文将探讨如何借助…