

vue3+TS 自定义指令:长按触发绑定的函数 - bbigger004
source link: https://www.cnblogs.com/bbigger004/p/17012784.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

vue3+TS 自定义指令:长按触发绑定的函数
偶然间看到一个在vue2中写的长按触发事件的自定义指定,想着能不能把他copy到我的vue3项目中呢。
编写自定义指令时遇到的几个难点
1.自定义指令的类型
在ts中写任何东西都要考虑到类型的问题,自定义指令的类型问题依然存在
2.在ts中使用setTimeout() 函数
setTimeout()函数的默认返回值是一个随机的number ,这个number 代表了这个计时器的唯一id,但是并不能直接将其类型定义为number 否则会出现报错。
3.自定义指令的传参问题
我这里的传参方法只做参考,写的很不规范。具体的好多传参的方法请自行搜索
这个是我自己编写的长按触发绑定的函数
directives/longPress.ts
import { ObjectDirective } from 'vue'
const LongPress: ObjectDirective = {
// 组件mounted时执行指令
mounted(el, binding, vNode) {
// 确保提供的表达式是函数
if (typeof binding.value !== 'function') {
// // 将警告传递给控制台
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 //定义空 定时器
const start = (e: MouseEvent | TouchEvent) => {
console.log(e)
//下列事件不执行1.不是鼠标左键2.单击事件 (3.没有传入长按时间 ?? 有默认)
if ((<MouseEvent>e).button !== 0 && e.type === 'click') {
return
}
if (timer == null) {
timer = setTimeout(() => {
handler()
}, Number(binding.arg) * 1000 ?? 0.5 * 10000) //默认长按0.5秒执行绑定的函数
}
}
const cancel = () => {
if (timer !== null) {
clearTimeout(timer)
console.log(timer);//定时器默认返回一个随机的number 这个number的值是这个定时器的id
timer = null
}
}
const handler = () => {
binding.value()
}
// 添加事件监听器
el.addEventListener('mousedown', start)
el.addEventListener('touchstart', start)
// 取消计时器
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 便是自定义指令,其中此处的参数传递方法仅供参考
<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>
Recommend
-
39
-
12
【Android】长按连续触发事件的实现方法 项目中需要实现一个类似购物车数量的小组件,需要单击时增加数量,长按时可以连续增大,之前的代码实现效果不理想,google后得到一个解决方法,测试可...
-
9
苹果AirTag内置NFC可触发快捷指令,实现自动化操作 2021年05月18日10:54 IT之家 我有话说(2人参与) 收藏本文 ...
-
8
QT QTimer 的单次延迟触发静态函数演示 哎哎5年前 (2016-09-22)C++962 #include <QApplication...
-
10
DynamoDB Stream 应用及触发 Lambda 函数 2021-09-08 — Yanbin DynamoDB Stream 的实质就是一个依附于表的流,对表的增删改像关系型数据的触发器一样,以日志形式按顺记录到该流中。我们可以用 API 去读取其中的记录,或用来触发一个 Lamb...
-
7
“全”事件触发:阿里云函数计算与事件总线产品完成全面深度集成 - 阿里巴巴云原生的个人空间 - OSCHINA - 中文开源技术交流社区 年度开源项目评选特别策划...
-
7
作者 | 渐意无论是在大数据处理领域,还是在消息处理领域,任务系统都有一个很关键的能力 - 任务触发去重。这个能力在一些对准确性要求极高的场景(如金融领域)中是必不可少的。作为 Serverless 化任务处理平台,Serverless Task 也需要提供这类保障,在用户...
-
7
鸿蒙JS自定义组件—长按膨胀按钮组件 作者:Looker_song 2022-10-25 15:12:24 常见的长按事件onlongpress不能设定长按的时间,除此之外,绑定了长按事件的按钮在完成长按操作前后并没有明显的样式变化,用户无法从...
-
6
详解异步任务:函数计算的任务触发去重 2023-01-03 10:38:04 本文介绍了函数计算 Serverless Task 对于任务触发去重的相关技术细节,以便支持对于任务执行准确性有严格要求的场景。
-
8
V2EX › Apple iPhone 14 Pro 无法通过在锁屏界面长按来触发编辑锁屏操作
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK