最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

1.需求

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

2.實(shí)現(xiàn)方式

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

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ù)點(diǎn)擊指令

import type { App } from 'vue';
import reClick from './reClick';
//引入其他指令
/**
 * 導(dǎo)出指令方法:v-xxx
 * @methods reClick 防止重復(fù)點(diǎn)擊,用法:v-reClick
 */
export function directive(app: App) {
	//連續(xù)點(diǎn)擊指令 v-reClick默認(rèn)3秒不能聯(lián)系點(diǎ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 默認(rèn)3秒內(nèi)反正重復(fù)點(diǎn)擊 -->
<el-button v-reClick type="primary" :disabled="loading">確定</el-button>
<!-- v-reClick="1000" 默認(rèn)1秒內(nèi)反正重復(fù)點(diǎn)擊 -->
<el-button v-reClick="1000" type="primary" :disabled="loading">確定</el-button>

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

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

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

但是有個(gè)缺點(diǎn):請(qǐng)求如果很慢,1秒鐘還沒有好,那么該方法就沒用了

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

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

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

  //自定義指令版本2:根據(jù)請(qǐng)求結(jié)果防止按鈕重復(fù)提交請(qǐng)求
  //使用方式如下:
  //1、請(qǐng)求函數(shù)不需要傳參,直接傳函數(shù)名或者包含函數(shù)名的對(duì)象,比如v-prevent-dup-click="submit"或者{fn:submit}
  //2、請(qǐng)求函數(shù)需要傳參,傳遞一個(gè)對(duì)象,包含函數(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`')
      }
      // 一開始是未點(diǎn)擊狀態(tài)
      el.isClicked = false
      const handerClick = function (event) {
        // 如果已經(jīng)點(diǎn)擊過,則阻止事件
        if (el.isClicked === 'true') {
          event.preventDefault()
          event.stopPropagation()
          return
        }
        // 標(biāo)記為已點(diǎn)擊
        el.isClicked = 'true'
        // 調(diào)用傳入的函數(shù)
        let fn: ReturnPromiseFn
        let params: any[] = []
        //如果只傳函數(shù)名
        if (typeof binding.value == 'function') {
          fn = binding.value
        } else {
          //如果傳對(duì)象{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ù)點(diǎn)擊多次提交的文章就介紹到這了,更多相關(guān)vue3自定義指令防止重復(fù)點(diǎn)擊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3項(xiàng)目中使用防抖節(jié)流的實(shí)現(xiàn)示例

    Vue3項(xiàng)目中使用防抖節(jié)流的實(shí)現(xiàn)示例

    防抖節(jié)流是可以說是一種優(yōu)化組件性能的技巧,可以有效減少組件中的渲染次數(shù)和計(jì)算量,本文主要介紹了Vue3項(xiàng)目中使用防抖節(jié)流的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-04-04
  • Vue的彈出框?qū)崿F(xiàn)圖片預(yù)覽和視頻預(yù)覽功能

    Vue的彈出框?qū)崿F(xiàn)圖片預(yù)覽和視頻預(yù)覽功能

    本文介紹基于Vue3的媒體預(yù)覽組件,支持圖片與視頻預(yù)覽,具備縮放、旋轉(zhuǎn)、拖拽功能,采用ElementUI Dialog容器,通過計(jì)算屬性實(shí)現(xiàn)動(dòng)態(tài)樣式,優(yōu)化拖拽性能,自動(dòng)調(diào)整方向,便于集成使用
    2025-08-08
  • Vue3中vue-router的使用方法詳解

    Vue3中vue-router的使用方法詳解

    Vue?Router?是?Vue?的官方路由,它與?Vue.js?核心深度集成,讓用?Vue.js?構(gòu)建單頁(yè)應(yīng)用變得輕而易舉,本文將通過簡(jiǎn)單的示例為大家介紹一下vue-router的使用,需要的可以參考一下
    2023-06-06
  • vue+element實(shí)現(xiàn)頁(yè)面頂部tag思路詳解

    vue+element實(shí)現(xiàn)頁(yè)面頂部tag思路詳解

    這篇文章主要介紹了vue+element實(shí)現(xiàn)頁(yè)面頂部tag效果,頁(yè)面顯示由數(shù)組循環(huán)得出,數(shù)組可存儲(chǔ)在store里,tags數(shù)組里面已經(jīng)有值,由于默認(rèn)是白色,所以頁(yè)面上看不出,接下來就是給選中的標(biāo)簽高亮,需要的朋友可以參考下
    2021-12-12
  • vue如何根據(jù)權(quán)限生成動(dòng)態(tài)路由、導(dǎo)航欄

    vue如何根據(jù)權(quán)限生成動(dòng)態(tài)路由、導(dǎo)航欄

    這篇文章主要介紹了vue如何根據(jù)權(quán)限生成動(dòng)態(tài)路由、導(dǎo)航欄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue3+element-plus 實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)路由的渲染的項(xiàng)目實(shí)踐

    vue3+element-plus 實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)路由的渲染的項(xiàng)目實(shí)踐

    本文主要介紹了vue3+element-plus 實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)路由的渲染的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼

    element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼

    這篇文章主要介紹了element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Vue2.0學(xué)習(xí)系列之項(xiàng)目上線的方法步驟(圖文)

    Vue2.0學(xué)習(xí)系列之項(xiàng)目上線的方法步驟(圖文)

    這篇文章主要介紹了Vue2.0學(xué)習(xí)系列之項(xiàng)目上線的方法步驟(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • Vitepress的文檔渲染基礎(chǔ)教程

    Vitepress的文檔渲染基礎(chǔ)教程

    這篇文章主要為大家介紹了Vitepress的文檔渲染基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • vue中計(jì)算屬性(computed)、methods和watched之間的區(qū)別

    vue中計(jì)算屬性(computed)、methods和watched之間的區(qū)別

    這篇文章主要給大家介紹了關(guān)于vue中計(jì)算屬性(computed)、methods和watched之間區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07

最新評(píng)論

大同市| 淳安县| 古田县| 浙江省| 大港区| 酒泉市| 慈利县| 北流市| 通许县| 涟源市| 漠河县| 香格里拉县| 南丰县| 胶南市| 汾西县| 珠海市| 宿迁市| 拉孜县| 淮南市| 手游| 定州市| 浦江县| 长阳| 和顺县| 蓬溪县| 晋城| 淮安市| 资讯 | 北碚区| 子洲县| 巴里| 手游| 泸州市| 那曲县| 淳化县| 陆良县| 桃江县| 永昌县| 宁乡县| 馆陶县| 屏东市|