el dialog 重复提交修复方案

news/2024/7/10 0:40:30 标签: elementui, 对话框, 重复提交, vue, el-dialog

element 虽好用, 但使用不当也容易导致一些奇怪的问题

今天讲讲 “对话框重复提交表单” 的问题




问题描述

有个对话框, 框里有个异步提交按钮

没加锁
可用重复点击

加了锁 :loading=“queryParamsLock”
对话框消失前还能点击
因为 “消失” 是一个动画

网络上建议在 el-dialog.open 事件里解锁
请求结束前, 重新打开对话框能点击




解决方法

把加锁条件改成这样

:loading=“queryParamsLock || !dialogVisible”




原理

因为提交按钮 :loading 设了 queryParamsLock || !dialogVisible

所以 !(queryParamsLock || !dialogVisible) 是按钮可点条件

计算得 !queryParamsLock && dialogVisible 按钮可点

queryParamsLockdialogVisible状态
目标值falsetrue按钮可点
打开对话框falsefalse
打开对话框falsetrue可用
异步请求truetrue
异步结束 && 关闭对话框falsefalse



demo

插件请自行补全

<html>

	<head>
		<meta charset="utf-8">
		<title>el dialog 重复提交修复方案</title>
		<link rel="stylesheet" href="../jvw/element-ui/element-ui@2.4.0/element-ui.2.4.0.css">
	</head>

	<body>
		<div id="swq">
			<App></App>
		</div>
		<script type="text/x-template" id="App-template">
			<div>
				<el-button @click="dialogVisible = true">点击打开 Dialog</el-button>

				<el-dialog title="提示" :visible.sync="dialogVisible">
					<div>这是一段信息</div>
					<div slot="footer">
						<el-button @click="dialogVisible = false">取消</el-button>
						<el-button type="primary" @click="queryParamsSubmit" :loading="queryParamsLock || !dialogVisible">不可重复提交</el-button>
						<el-button type="primary" @click="queryParamsSubmit" :loading="queryParamsLock">对话框消失前可提交</el-button>
						<el-button type="danger" @click="queryParamsSubmit">重复提交</el-button>
					</div>
				</el-dialog>
			</div>
		</script>
		<script src="../jvw/vue/vue@2.5.16.js"></script>
		<script src="../jvw/element-ui/element-ui@2.4.0/1element-ui.2.4.0.js"></script>
		<script type="text/javascript">
			var App = {
				template: "#App-template",
				data: function() {
					return {
						dialogVisible: false,
						queryParamsLock: false,
					}
				},
				methods: {
					// 提交对话框
					queryParamsSubmit() {
						console.log("请求")
						// validate 通过
						if(this.queryParamsLock) {
							return
						}
						// 上锁
						this.queryParamsLock = true

						// 请求
						setTimeout(() => {
							// 请求结束

							// 关闭
							this.dialogVisible = false
							// 解锁
							this.queryParamsLock = false
						}, 1000)

					},
				},
			};
			var vu = new Vue({
				el: "#swq",
				components: {
					App: App,
				},
			})
		</script>
	</body>

</html>

end


http://www.niftyadmin.cn/n/913413.html

相关文章

POJ 2159 Ancient Cipher

/**//**************************************Problem: POJ 2159 Ancient CipherTime: 16MSMemory: 204K Accepted Time: 2009-05-16 11:53:29Tips: 读懂题意 **************************************/#include <stdio.h>#include <string.h>#include <stdlib.h…

GridView全选全不选以及读取隐藏列的值的方法

经过测试可以使用的方法&#xff1a; 1、在gridview里边设置两个checkbox&#xff0c;均为服务器控件&#xff0c;postback不需要&#xff1b;如下面的代码 <asp:GridView ID"gvUsers" runat"server" AutoGenerateColumns"False" …

qDebug 没有输出

修改运行环境变量

Mvc如何重写控制器工厂!

直接上代码&#xff0c;主要看红色文字&#xff0c;在这里根据自己项目需求获取到控制器的type。 public class CustomControllerFactory : DefaultControllerFactory{/// <summary>/// 根据控制器名称及请求信息获得控制器类型。/// </summary>/// <param name…

linux wc 统计src目录下java源码总行数

find -type f | grep \\.java | xargs -i cat {} |wc -l

bzoj 4295 [PA2015]Hazard 贪心,暴力

[PA2015]Hazard Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 69 Solved: 19[Submit][Status][Discuss]Description 有n个人在轮流玩赌博机&#xff0c;一开始编号为i的人有a[i]元钱。赌博机可以抽象为一个长度为m的仅包含1和-1的序列&#xff0c;若抽到1&#xff0c;那么…

deepin linux pkexec 启动图形界面报错 unable to open display Unable to initialize GTK+, is DISPLAY set prop

原因&#xff1a;环境变量关于显示配置参数不存在导致。 需要配置环境变量&#xff1a;DISPLAY XAUTHORITY 参考测试脚本/home/yeqiang/tmp/t.sh&#xff08;注意当前用户名yeqiang&#xff09; #!/bin/bash export DISPLAY:0 export XAUTHORITY/home/yeqiang/.Xauthorityfi…