下面來探討一個常見的問題 - 阻止多次點擊。
// 原始版本:獲取 element 元素并綁定 click 事件
var element = document.querySelector('.foo');
element.addEventListener('click', function() {
// 實現點擊后的操作
});
// 防止用戶重復點擊的版本
var element = document.querySelector('.foo');
var timer;
element.addEventListener('click', function() {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function() {
// 實現點擊后的操作
}, 1000);
});
防止多次點擊的方法顯然是增加一個計時器,確保在一定時間內只有一次點擊事件被觸發。對 Web 應用來說這和用戶界面的一致性有一定的關系。
在 Vue 應用中,這是非常容易實現的。我們可以使用一個獨立的方法(通常叫`debounce`)并在需要延遲的函數中使用它。
// 取到 debounce 方法并調用它
var example1 = new Vue({
// ...
methods: {
// 將 `this.handleClick` 替換成 `_debounce(handleClick, 500)`
handleClick: _.debounce(function() {
console.log('Clicked!');
}, 500)
}
})
這里我們使用了 Lodash 的_.debounce
方法。這個方法返回一個新函數,它限制了原來函數的調用頻率,能夠實現上述的效果。
除此之外,還有一些其他的方法可以避免重復點擊。例如,我們可以為按鈕綁定一個狀態,在操作完成之前禁用它。
new Vue({
// ...
data: {
isLoading: false
},
methods: {
handleClick: function () {
var vm = this
if (!vm.isLoading) {
vm.isLoading = true
// ajax 請求完成后, 設置 `isLoading` 為 false
}
}
}
})
這段代碼看起來并沒有什么驚人之處,事實上這已經是前端中非常常見的一個模式了。Vue 為我們提供了更加優秀的實現——computed 屬性。
new Vue({
// ...
computed: {
buttonDisabled: function () {
// 這里的邏輯是 ajax 請求未完成時返回 true, 否則返回 false
}
},
methods: {
handleClick: function () {
// 這里的代碼和前例是完全相同的
}
}
})
在這里,我們使用計算屬性來表示按鈕的可用狀態,這是一個相對更加簡便的實現。然而,實現按鈕禁用的方法與上面的版本并沒有什么區別。
總結:多次點擊是 Web 應用一個常見的問題,在 Vue 中使用_.debounce
方法來解決這個問題非常容易。我們也可以使用狀態或計算屬性來簡化這個過程。