亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

VUE3自定義指令防止重復(fù)點擊多次提交的實現(xiàn)方法

 更新時間:2024年08月01日 12:22:49   作者:MadSnail00  
vue3項目,新增彈框連續(xù)點擊確定按鈕防止多次提交,在按鈕上添加自定義指令,這篇文章主要介紹了VUE3自定義指令防止重復(fù)點擊多次提交的實現(xiàn)方法,需要的朋友可以參考下

VUE3自定義指令防止重復(fù)點擊多次提交

1.需求

vue3項目,新增彈框連續(xù)點擊確定按鈕防止多次提交,在按鈕上添加自定義指令

2.實現(xiàn)方式

reClick.ts文件  防止重復(fù)點擊方法,自定義指令

export default {
    mounted(el: any, binding: any) {
        el.addEventListener('click', () => {
            if (!el.disabled) {
                el.disabled = true
                setTimeout(() => {
                    el.disabled = false
                }, binding.value || 3000)
            }
        })
    }
}

index.ts文件 引入多種自定義指令,包括防止重復(fù)點擊指令

import type { App } from 'vue';
import reClick from './reClick';
//引入其他指令
/**
 * 導(dǎo)出指令方法:v-xxx
 * @methods reClick 防止重復(fù)點擊,用法:v-reClick
 */
export function directive(app: App) {
	//連續(xù)點擊指令 v-reClick默認3秒不能聯(lián)系點擊 v-reClick="1000"
	app.directive('reClick', reClick);
}

main.ts全局引入

import App from './App.vue';
import {directive} from '@/directive/index.ts'; //引入自定義指令
const app = createApp(App);
directive(app); //全局引入

vue文件使用

<!-- v-reClick 默認3秒內(nèi)反正重復(fù)點擊 -->
<el-button v-reClick type="primary" :disabled="loading">確定</el-button>
<!-- v-reClick="1000" 默認1秒內(nèi)反正重復(fù)點擊 -->
<el-button v-reClick="1000" type="primary" :disabled="loading">確定</el-button>

補充:vue3——兩種利用自定義指令實現(xiàn)防止按鈕重復(fù)點擊的方法

vue3——兩種利用自定義指令實現(xiàn)防止按鈕重復(fù)點擊的方法

方法一:利用定時器設(shè)置時間,下方代碼設(shè)置時間為1秒

但是有個缺點:請求如果很慢,1秒鐘還沒有好,那么該方法就沒用了

  // 利用定時器:1秒之后才能再次點擊
  app.directive('preventReClick', {
    mounted: (el, binding) => {
      el.addEventListener('click', () => {
        if (!el.disabled) {
          el.disabled = true
          setTimeout(() => {
            el.disabled = false
          }, binding.value || 1000)
        }
      })
    }
  })

方法二:傳入請求的函數(shù)作為參數(shù),根據(jù)請求的finally來判斷是否可以點擊了,更推薦?。?!

但是傳入的參數(shù)必須是一個promise函數(shù)??!

  //自定義指令版本2:根據(jù)請求結(jié)果防止按鈕重復(fù)提交請求
  //使用方式如下:
  //1、請求函數(shù)不需要傳參,直接傳函數(shù)名或者包含函數(shù)名的對象,比如v-prevent-dup-click="submit"或者{fn:submit}
  //2、請求函數(shù)需要傳參,傳遞一個對象,包含函數(shù)名和參數(shù),比如{fn:submit,params:[1,2,3]}
import type { App, Directive, DirectiveBinding } from 'vue'
 interface ReturnPromiseFn {
  (...args: any[]): Promise<any>
 }
 interface objectType {
  fn: ReturnPromiseFn
   params?: any[]
 }
app.directive('preventDupClick', directiveBindingDirective)
 const directiveBindingDirective: Directive = {
    mounted(el, binding: DirectiveBinding<ReturnPromiseFn & objectType>) {
      if (!binding.value) {
        throw new Error('v-prevent-dup-click must pass a parameter')
      }
      if (typeof binding.value !== 'function' && typeof binding.value !== 'object') {
        throw new Error('v-prevent-dup-click requires a function or an object with a function `fn`')
      }
      // 一開始是未點擊狀態(tài)
      el.isClicked = false
      const handerClick = function (event) {
        // 如果已經(jīng)點擊過,則阻止事件
        if (el.isClicked === 'true') {
          event.preventDefault()
          event.stopPropagation()
          return
        }
        // 標記為已點擊
        el.isClicked = 'true'
        // 調(diào)用傳入的函數(shù)
        let fn: ReturnPromiseFn
        let params: any[] = []
        //如果只傳函數(shù)名
        if (typeof binding.value == 'function') {
          fn = binding.value
        } else {
          //如果傳對象{fn:submit,params:[1,2,3]}或者{fn:submit}
          fn = (binding.value as objectType).fn
          params = (binding.value as objectType)?.params ?? []
        }
        console.log(params, 'params')
        try {
          fn(...params).finally(() => {
            el.isClicked = false
          })
        } catch (error) {
          throw new Error('binding.value或 binding.value.fn必須是返回Promise類型的函數(shù)')
        }
      }
      el.hander = handerClick
      el.addEventListener('click', handerClick)
    },
    //銷毀事件
    beforeUnmount(el) {
      if (el.hander) {
        el.removeEventListener('click', el.hander)
      }
    }
  }

到此這篇關(guān)于VUE3自定義指令防止重復(fù)點擊多次提交的文章就介紹到這了,更多相關(guān)vue3自定義指令防止重復(fù)點擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue時間格式總結(jié)以及轉(zhuǎn)換方法詳解

    vue時間格式總結(jié)以及轉(zhuǎn)換方法詳解

    項目中后臺返回的時間有多種形式,時間戳、ISO標準時間格式等,我們需要轉(zhuǎn)化展示成能看的懂得時間格式,下面這篇文章主要給大家介紹了關(guān)于vue時間格式總結(jié)以及轉(zhuǎn)換方法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • vue 開發(fā)企業(yè)微信整合案例分析

    vue 開發(fā)企業(yè)微信整合案例分析

    這篇文章主要介紹了vue 開發(fā)企業(yè)微信整合,結(jié)合具體案例形式分析了vue.js使用企業(yè)微信JSSDK實現(xiàn)手機端程序可以和企業(yè)微信進行整合功能的相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Vue全局事件總線你了解嗎

    Vue全局事件總線你了解嗎

    這篇文章主要為大家詳細介紹了Vue全局事件總線,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 解決vue-router進行build無法正常顯示路由頁面的問題

    解決vue-router進行build無法正常顯示路由頁面的問題

    下面小編就為大家分享一篇解決vue-router進行build無法正常顯示路由頁面的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue2項目使用sass的示例代碼

    vue2項目使用sass的示例代碼

    本篇文章主要介紹了vue項目使用sass的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue.js學(xué)習(xí)之vue-cli定制腳手架詳解

    vue.js學(xué)習(xí)之vue-cli定制腳手架詳解

    這篇文章主要給大家介紹了vue.js學(xué)習(xí)之vue-cli定制腳手架的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • 創(chuàng)建Vue項目以及引入Iview的方法示例

    創(chuàng)建Vue項目以及引入Iview的方法示例

    這篇文章主要介紹了創(chuàng)建Vue項目以及引入Iview的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue2中l(wèi)ess的安裝以及使用教程

    vue2中l(wèi)ess的安裝以及使用教程

    less是css預(yù)處理器,對原先css進行了擴展和補充,下面這篇文章主要給大家介紹了關(guān)于vue2中l(wèi)ess的安裝以及使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • vue-cli3.0 axios跨域請求代理配置方式及端口修改

    vue-cli3.0 axios跨域請求代理配置方式及端口修改

    這篇文章主要介紹了vue-cli3.0 axios跨域請求代理配置方式及端口修改,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue項目在webpack2實現(xiàn)移動端字體自適配功能

    vue項目在webpack2實現(xiàn)移動端字體自適配功能

    這篇文章主要介紹了vue項目在webpack2實現(xiàn)移動端字體自適配的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06

最新評論