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>

vue3+TS 自定义指令:长按触发绑定的函数的更多相关文章

  1. 使用 vue3 的自定义指令给 element-plus 的 el-dialog 增加拖拽功能

    element-plus 提供的 el-dialog 对话框功能非常强大,只是美中不足不能通过拖拽的方式改变位置,有点小遗憾,那么怎么办呢?我们可以通过 vue 的自定义指令来实现一个可以拖拽的对话框 ...

  2. vue3.0自定义指令(drectives)

    在大多数情况下,你都可以操作数据来修改视图,或者反之.但是还是避免不了偶尔要操作原生 DOM,这时候,你就能用到自定义指令. 举个例子,你想让页面的文本框自动聚焦,在没有学习自定义指令的时候,我们可能 ...

  3. VUE3 之 自定义指令的实现 - 这个系列的教程通俗易懂,适合新手

    1. 概述 老话说的好:能屈能伸的人生,才是完满而丰富的人生. 言归正传,今天我们来聊聊 VUE 中自定义指令的实现. 2. 自定义指令 2.1 文本框聚焦的实现  <body> < ...

  4. vue3 自定义指令控制按钮权限

    经过1个周的摸索和查阅资料,终于搞定VUE3中自定义指令,实现按钮级别的权限控制.当然,只是简单的对按钮进行隐藏和删除的dom操作比较容易,一直纠结的是当按钮无权限时,不是直接删除当前dom元素(bu ...

  5. Angularjs进阶笔记(2)-自定义指令中的数据绑定

    有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊到底怎么用这个话题. 一. 自定义指令 自定义指令,是Angularjs用来实 ...

  6. angularjs自定义指令

    my-directive为指令名称,thisdata为绑定的数据 <span ng-repeat="act in move.casts" style="positi ...

  7. vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件

    基于Vue3.0构建PC桌面端自定义美化滚动条组件V3Scroll. 前段时间有分享一个Vue3 PC网页端弹窗组件,今天带来最新开发的Vue3.0版虚拟滚动条组件. V3Scroll 使用vue3. ...

  8. Vue2自定义指令改变DOM值后未刷新data中绑定属性的值

    标签(空格分隔): Vue 自定义指令用于过滤输入框,只允许输入数字: Vue.directive('numberOnly', { bind: function (el, binding) { el. ...

  9. 移动端H5长按事件 vue自定义指令

    import Vue from 'vue' Vue.directive('longpress', function (el, binding){ var timer = null; var start ...

  10. vue自定义指令clickoutside实现点击其他元素才会触发

    clickoutside.js // 代码内容 const clickoutsideContext = '@@clickoutsideContext'; export default { bind(e ...

随机推荐

  1. 关于aws账单数据中几个重要的与费用相关的字段的意义分析

    今天在看aws账号的详细信息时,看到字段很多,大多数字段,根据名称可以知道代表的意义 对于如下几个字段的概念有点模糊(位于"UsageStartDate","UsageE ...

  2. 微信小程序js-时间转换函数使用

    最近在做云开发博客小程序 采集微信发布的信息放入数据库会有createTime因此发现了不一样的地方 云函数可以直接使用 但是放到引导全局的app.js文件却是找不到该方法-->dateform ...

  3. 认识 Redis client-output-buffer-limit 参数与源码分析

    概述 Redis 的 client-output-buffer-limit 可以用来强制断开无法足够快从 redis 服务器端读取数据的客户端.保护机制规则如下: [hard limit] 大小限制, ...

  4. Springboot+Vue实现将图片和表单一起提交到后端,同时将图片地址保存到数据库、再次将存储的图片展示到前端vue页面

    文章目录 1.实现的效果 2.Vue前端 3.图片上传 4.字段变量根据自己的字段名自行设置(这里不给出了,哈哈哈) 5.method方法 5.1.图片显示在选择框中,同时返回后端存储的地址 5.2查 ...

  5. python学习笔记----必备知识

    一.必备知识 二.流程控制 https://blog.csdn.net/weixin_43304253/article/details/120778228 1.1语法特点: 1.1.1 代码注释 单行 ...

  6. 三十三、HPA实现自动扩缩容

    通过HPA实现业务应用的动态扩缩容 HPA控制器介绍 当系统资源过高的时候,我们可以使用如下命令来实现 Pod 的扩缩容功能 $ kubectl -n luffy scale deployment m ...

  7. Scrapy 发送Request Payload

    Scrapy 发送Request Payload 首先要打开 F12 进入调试模式 然后 查看是用什么方法获取的 如果是Json: 1. json.dumps 转化成Json yield Reques ...

  8. perl匹配特殊写法

    my $name='4'; #找匹配4 for($name) { if(/^4$/) { print "success\n"; } else { print "faile ...

  9. fastjson远程代码执行漏洞

    fastjson漏洞学习记录 免责声明: Fastjson 1.2.24 远程代码执行漏洞 漏洞说明 前提条件 影响范围 漏洞复现 Fastjson<=1.2.47 远程代码执行漏洞 Fastj ...

  10. Inventor 2021保姆级安装教程

    Inventor 2021 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载INT21_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,安装前先断网,然后找到I ...