vue指令防止按鈕連點(diǎn)解析
vue指令防止按鈕連點(diǎn)
在開發(fā)中,經(jīng)常會(huì)遇到客戶反饋一個(gè)數(shù)據(jù)提交了兩邊的情況,這種情況不能夠去限制用戶的操作規(guī)范通常的處理方式都會(huì)在按鈕產(chǎn)生的函數(shù)中做處理,但是這樣的重復(fù)性工作讓我很難受,所以自己嘗試用vue指令的方式去解決。
查過不少教程,都是去更改disabled屬性去解決,但是這并不是我想要的一種效果,所以經(jīng)過一些其他的參考和自己的想法有了一下這種方式
在使用指令的時(shí)候我們需要知道指令的一些基本知識(shí)(飛機(jī)票轉(zhuǎn)場(chǎng)vue官網(wǎng))
鉤子函數(shù)
bind
:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用。在這里可以進(jìn)行一次性的初始化設(shè)置。inserted
:被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (僅保證父節(jié)點(diǎn)存在,但不一定已被插入文檔中)。update
:所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新componentUpdated
:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。unbind
:只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
鉤子函數(shù)參數(shù)
el
:指令所綁定的元素,可以用來直接操作 DOM。binding
:一個(gè)對(duì)象,包含以下 property:name
:指令名,不包括 v- 前綴。value
:指令的綁定值,例如:v-my-directive=“1 + 1” 中,綁定值為 2。oldValue
:指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。expression
:字符串形式的指令表達(dá)式。例如 v-my-directive=“1 + 1” 中,表達(dá)式為 “1 + 1”。arg
:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 “foo”。modifiers
:一個(gè)包含修飾符的對(duì)象。例如:v-my-directive.foo.bar 中,修飾符對(duì)象為 { foo: true, bar: true }。
vnode
:Vue 編譯生成的虛擬節(jié)點(diǎn)。移步 VNode API 來了解更多詳情。oldVnode
:上一個(gè)虛擬節(jié)點(diǎn),僅在 update 和 componentUpdated 鉤子中可用。
實(shí)現(xiàn)
在頁面中使用
<template> ? <div> ? ?<el-button v-preventDbClick:continuous="j">測(cè)試連點(diǎn)</el-button> ? ?<!--v-preventDbClick:continuous="j" 這種寫法是為了實(shí)現(xiàn)方法傳參 下面會(huì)結(jié)合js解釋--> ? ?<div> ? ? ?<h1>{{i}}</h1> ? ?</div> ? </div> </template>
<script> export default { ? data(){ ? ? return{ ? ? ? i: '6', ? ? ? j: '56' ? ? } ? }, ? methods:{ ? ? continuous(value){ ? ? ? this.i = value ? ? }, ? }, } </script>
在directives.js文件下
?Vue.directive('preventDbClick',{ ? ? bind(el, binding, vnode){ ? ? ? let timer ? ? ? el.addEventListener('click',() =>{ ? ? ? ? if (timer) { ? ? ? ? ? clearTimeout(timer) ? ? ? ? } ? ? ? ? timer = setTimeout(() => { ? ? ? ? ? let _this = vnode.context ? ? ? ? ? // binding.arg的值就是v-preventDbClick:continuous的continuous ? 此時(shí)的continuous是靜態(tài)的 ? ? ? ? ? // 官網(wǎng)實(shí)例 v-mydirective:[argument]="value" ?argument 參數(shù)可以根據(jù)組件實(shí)例數(shù)據(jù)進(jìn)行更新 ? ? ? ? ? // binding.value則是需要的傳參 ? ? ? ? ? _this[binding.arg](binding.value)?? ? ? ? ? ? }, 300) ? ? ? }) ? ? } ? })
在main.js中引用
import directives from './directives' Vue.use(directives)
這種方式并不完善,有些情況并不適用(比如傳多個(gè)參數(shù))。希望這種方式能夠給你新的思路。
vue防連點(diǎn),重復(fù)點(diǎn)擊
防止重復(fù)點(diǎn)擊,重復(fù)提交或者重復(fù)跳轉(zhuǎn)頁面
自定義指令,通過在標(biāo)簽原型上面綁定狀態(tài)的方式,控制是否可以重復(fù)點(diǎn)擊
局部注冊(cè)
export default { ? name: "", ? directives: { ? ? preventRepeat: { ? ? ? inserted(el, binding) { ? ? ? ? function __avoidRepeatHandler__() { ? ? ? ? ? if (el.__clickDisabled__) return; ? ? ? ? ? el.__clickDisabled__ = true; ? ? ? ? ? el.__originalPointerEvents__ = el.style.pointerEvents; ? ? ? ? ? el.style.pointerEvents = "none"; ? ? ? ? ? setTimeout(() => { ? ? ? ? ? ? el.__clickDisabled__ = false; ? ? ? ? ? ? el.style.pointerEvents = el.__originalPointerEvents__; ? ? ? ? ? }, binding.value || 1000); ? ? ? ? } ? ? ? ? el.addEventListener("click", __avoidRepeatHandler__); ? ? ? ? el.__avoidRepeatHandler__ = __avoidRepeatHandler__; ? ? ? }, ? ? ? unbind(el) { ? ? ? ? el.removeEventListener("click", el.__avoidRepeatHandler__); ? ? ? ? delete el.__clickDisabled__; ? ? ? ? delete el.__originalPointerEvents__; ? ? ? }, ? ? }, ? }, ?}
在需要訪點(diǎn)擊提交的地方使用此指令v-preventRepeat或者v-prevent-repeat
?<div ?@click="pointPraise" v-preventRepeat>提交</div>
全局注冊(cè)
新建plugins.js
export default { ? install(Vue) { ? ? // 防重復(fù)點(diǎn)擊(指令實(shí)現(xiàn)) ? ? Vue.directive('preventRepeat', { ? ? ? inserted(el, binding) { ? ? ? ? function __avoidRepeatHandler__() { ? ? ? ? ? if (el.__clickDisabled__) return; ? ? ? ? ? el.__clickDisabled__ = true; ? ? ? ? ? el.__originalPointerEvents__ = el.style.pointerEvents; ? ? ? ? ? el.style.pointerEvents = "none"; ? ? ? ? ? setTimeout(() => { ? ? ? ? ? ? el.__clickDisabled__ = false; ? ? ? ? ? ? el.style.pointerEvents = el.__originalPointerEvents__; ? ? ? ? ? }, binding.value || 1000); ? ? ? ? } ? ? ? ? el.addEventListener("click", __avoidRepeatHandler__); ? ? ? ? el.__avoidRepeatHandler__ = __avoidRepeatHandler__; ? ? ? }, ? ? ? unbind(el) { ? ? ? ? el.removeEventListener("click", el.__avoidRepeatHandler__); ? ? ? ? delete el.__clickDisabled__; ? ? ? ? delete el.__originalPointerEvents__; ? ? ? }, ? ? }) ? } }
main.js中全局引入并使用
import directives from '@/utils/plugins.js' Vue.use(directives)
在需要訪點(diǎn)擊提交的地方使用此指令v-preventRepeat
<div ?@click="pointPraise" v-preventRepeat>提交</div>
可以傳參指定時(shí)間
<div v-preventRepeat="800" @click="onClick">
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue 動(dòng)態(tài)組件用法示例小結(jié)
這篇文章主要介紹了vue 動(dòng)態(tài)組件用法,結(jié)合實(shí)例形式總結(jié)分析了vue 動(dòng)態(tài)組件基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03Vue.js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼
這篇文章主要介紹了vue js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05vue.js中使用微信掃一掃解決invalid signature問題(完美解決)
這篇文章主要介紹了vue.js中使用微信掃一掃解決invalid signature問題(推薦),本文通過實(shí)例代碼給出解決方法,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04vue實(shí)現(xiàn)學(xué)生錄入系統(tǒng)之添加刪除功能
本文給大家?guī)硪粋€(gè)小案例基于vue實(shí)現(xiàn)學(xué)生錄入系統(tǒng)功能,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07詳解如何配置vue-cli3.0的vue.config.js
這篇文章主要介紹了詳解如何配置vue-cli3.0的vue.config.js,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08