vue3+TS 實(shí)現(xiàn)自定義指令長(zhǎng)按觸發(fā)綁定的函數(shù)
而然間看到一個(gè)在vue2中寫(xiě)的長(zhǎng)按觸發(fā)事件的自定義指定,想著能不能把他copy到我的vue3項(xiàng)目中呢。
編寫(xiě)自定義指令時(shí)遇到的幾個(gè)難點(diǎn)
1.自定義指令的類(lèi)型
在ts中寫(xiě)任何東西都要考慮到類(lèi)型的問(wèn)題,自定義指令的類(lèi)型問(wèn)題依然存在
2.在ts中使用setTimeout() 函數(shù)
setTimeout()函數(shù)的默認(rèn)返回值是一個(gè)隨機(jī)的number ,這個(gè)number 代表了這個(gè)計(jì)時(shí)器的唯一id,但是并不能直接將其類(lèi)型定義為number 否則會(huì)出現(xiàn)報(bào)錯(cuò)。
3.自定義指令的傳參問(wèn)題
我這里的傳參方法只做參考,寫(xiě)的很不規(guī)范。具體的好多傳參的方法請(qǐng)自行搜索
代碼
這個(gè)是我自己編寫(xiě)的長(zhǎng)按觸發(fā)綁定的函數(shù)
directives/longPress.ts
import { ObjectDirective } from 'vue' const LongPress: ObjectDirective = { // 組件mounted時(shí)執(zhí)行指令 mounted(el, binding, vNode) { // 確保提供的表達(dá)式是函數(shù) if (typeof binding.value !== 'function') { // // 將警告?zhèn)鬟f給控制臺(tái) let warn = `[longpress:] provided expression '${binding.value}' is not afunction, but has to be ` console.log(warn) } else { console.table({ el, binding, vNode }) let timer: ReturnType<typeof setTimeout> | null = null //定義空 定時(shí)器 const start = (e: MouseEvent | TouchEvent) => { console.log(e) //下列事件不執(zhí)行1.不是鼠標(biāo)左鍵2.單擊事件 (3.沒(méi)有傳入長(zhǎng)按時(shí)間 ?? 有默認(rèn)) if ((<MouseEvent>e).button !== 0 && e.type === 'click') { return } if (timer == null) { timer = setTimeout(() => { handler() }, Number(binding.arg) * 1000 ?? 0.5 * 10000) //默認(rèn)長(zhǎng)按0.5秒執(zhí)行綁定的函數(shù) } } const cancel = () => { if (timer !== null) { clearTimeout(timer) console.log(timer);//定時(shí)器默認(rèn)返回一個(gè)隨機(jī)的number 這個(gè)number的值是這個(gè)定時(shí)器的id timer = null } } const handler = () => { binding.value() } // 添加事件監(jiān)聽(tīng)器 el.addEventListener('mousedown', start) el.addEventListener('touchstart', start) // 取消計(jì)時(shí)器 el.addEventListener('click', cancel) el.addEventListener('mouseout', cancel) el.addEventListener('touchend', cancel) el.addEventListener('touchcancel', cancel) } }, } export default LongPress
在main.ts中引入 作為全局自定義指令
import { createApp } from 'vue' import App from './App.vue' import LongPress from './directives/longpress' const app = createApp(App) app.directive('longPress',LongPress) app.mount('#app')
在組件中使用
這里的v-longPress 便是自定義指令,其中此處的參數(shù)傳遞方法僅供參考
<template> <div> <button v-longPress = 'longFunc,1' >longPress</button> </div> </template> <script setup lang="ts"> const longFunc = () => { console.log('click long btn'); alert('click long btn') } </script> <style scoped> </style>
到此這篇關(guān)于vue3+TS 自定義指令:長(zhǎng)按觸發(fā)綁定的函數(shù)的文章就介紹到這了,更多相關(guān)vue3 ts自定義指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Vue純前端實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼并實(shí)現(xiàn)倒計(jì)時(shí)
在實(shí)際的應(yīng)用開(kāi)發(fā)中,涉及用戶(hù)登錄驗(yàn)證、密碼重置等場(chǎng)景時(shí),通常需要前端實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼的功能,以提升用戶(hù)體驗(yàn)和安全性,以下是一個(gè)簡(jiǎn)單的前端實(shí)現(xiàn),演示了如何在用戶(hù)點(diǎn)擊發(fā)送驗(yàn)證碼按鈕時(shí)觸發(fā)短信驗(yàn)證碼的發(fā)送,并開(kāi)始一個(gè)倒計(jì)時(shí)2024-04-04vue+elementUI實(shí)現(xiàn)點(diǎn)擊左右箭頭切換按鈕功能
這篇文章主要介紹了vue+elementUI實(shí)現(xiàn)點(diǎn)擊左右箭頭切換按鈕功能,樣式可以根據(jù)自己需求改動(dòng),感興趣的朋友可以參考下實(shí)現(xiàn)代碼2024-05-05vue修改數(shù)據(jù)頁(yè)面無(wú)效的解決方案
這篇文章主要介紹了vue修改數(shù)據(jù)頁(yè)面無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子
今天小編就為大家分享一篇在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Vue淺析講解動(dòng)態(tài)組件與緩存組件及異步組件的使用
這篇文章主要介紹了Vue開(kāi)發(fā)中的動(dòng)態(tài)組件與緩存組件及異步組件的使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09elementui源碼學(xué)習(xí)仿寫(xiě)el-link示例詳解
這篇文章主要為大家介紹了elementui源碼學(xué)習(xí)仿寫(xiě)el-link示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Vue.js實(shí)現(xiàn)一個(gè)todo-list的上移下移刪除功能
這篇文章主要介紹了Vue.js實(shí)現(xiàn)一個(gè)todo-list的上移下移刪除功能,需要的朋友可以參考下2017-06-06vue項(xiàng)目如何使用$router.go(-1)返回時(shí)刷新原來(lái)的界面
這篇文章主要介紹了vue項(xiàng)目如何使用$router.go(-1)返回時(shí)刷新原來(lái)的界面問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09