場景:收費處醫生,為了提高效率,快速開單,經常會習慣性的多點保存/確認按鈕;往往會發生多次請求,造成打印單據重復,結算金額對不上;故提出防止重復提交的控制;
解決方案:1.增加二次確認操作,彈框式確認;無疑會增加操作步驟,更麻煩了。2.防抖函數,控制在幾秒內的點擊只提交一次請求,記錄最后一次點擊開始計時請求;(待定)3.變量開關控制,保證幾秒之內只提交一次,代碼塊立即
執行(可取)
實現:2.防抖函數
封裝方法 例如:tools/index下Util對象中


/*
* fn [function] 需要防抖的函數
* interval [number] 毫秒,防抖期限值
* 在第一次觸發事件時,不立即執行函數,而是給出一個期限值比如300ms
* 讓某個時間期限(300毫秒)內,事件處理函數只執行一次。
*/
debounce(fn, interval) {
var timeout = null;//借助閉包
return function (e) {
clearTimeout(timeout);//進入該分支語句,說明當前正在一個計時過程中,並且又觸發了相同事件。所以要取消當前的計時,重新開始計時
timeout = setTimeout(() => { // 進入該分支說明當前並沒有在計時,那么就開始一個計時
fn.apply(this, arguments);
}, interval ? interval : 300);
};
},
引入方法
import { Util } from 'tools/index';
a.
handleQuery = Util.debounce((name, status, quarters) => {
console.log("---",name, status, quarters)
//代碼塊 可接收參數
},2000)
b. 按鈕事件 handleBtn
handleBtn=()=>{
let {status, name, quarters} = this.state;
this.handleQuery(name, status, quarters);
}
缺點:防抖函數每次會在設定時間內 記錄最后一次點擊,然后開始計時,會增加業務場景中的等待時間;
3.js控制變量
全局設置一個變量 或者state變量儲存

// 按鈕事件
handleBtn = () => {
if(isClick) {
isClick = false;
//事件
//定時器
setTimeout(function() {
isClick = true;
}, 3000);//3秒內不能重復點擊
//執行代碼塊
}else{
message.warning("請勿重復點擊!")
}
}
效果:

