首页 > 其他分享 >vue3+TS 自定义指令:长按触发绑定的函数

vue3+TS 自定义指令:长按触发绑定的函数

时间:2022-12-29 16:01:04浏览次数:57  
标签:el const 自定义 binding TS timer 指令 vue3

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>

标签:el,const,自定义,binding,TS,timer,指令,vue3
From: https://www.cnblogs.com/bbigger004/p/17012784.html

相关文章

  • vue3 变量改变触发界面显示改变
    我们需要使用到 ref 和 reactive 来触发界面绑定变量的更新。reactive的参数对象一般是对象或者数组,能够将复杂数据类型变为响应式数据;它的响应式是深层次的,底层......
  • JSX/TSX的好处
    1.之前没怎么用过JSX/TSX,基本上还是用html/css/js分离的方式,但是最近的一个@click="func(3)"的实现,发现了JSX的好处之一;如上,在html的某个元素里用了@click="func(3)"属......
  • windows 10 桌面ctrl alt 自定义快捷键打开程序慢 响应很慢 延迟问题
    思路为:关闭后台应用具体步骤如下:1.)设置,搜索 隐私  2.)找到隐私设置  3.)关闭后台这些后台应用,我都不需要,所以直接全部关闭了,如果有需要可以逐个实验,查找出来到底是哪个后......
  • BitSail“拍了拍”你,并给你一份快速入门指南
    本QuickGuide面向BitSail新手入门使用人员,从源码编译、产物结构、如何提交作业、实机演示等多方面带领大家迅速入门BitSail,从0到1了解并完成BitSail基础构建。......
  • WPF 自定义附加事件
    我们都知道路由事件,而附加事件用的比较少。但如果是通用的场景,类似附加属性,附加事件就很有必要的。举个例子,输入设备有很多种,WPF中输入事件主要分为鼠标、触摸、触笔:WPF......
  • vue3.0的生命周期
    1.vue3的生命周期与vue2的不同点:  2.vue3的生命周期与vue2对应的点:2.1beforeCreate和create相当于setup,因为不能写入setup生命周期内2.2使用vue3的组合式AP......
  • 自定义view01 - 综述
    TypedArrayvaltypedArray:TypedArray=context.obtainStyledAttributes(attrs,R.styleable.EdgeTransparentView)position=typedArray.getI......
  • 自定义View03 - Canvas
    save/savelayerCanvas里面牵扯两种坐标系:Canvas自己的坐标系、绘图坐标系,当Canvas画布被创建时,Canvas的坐标系就被创建了,并且此坐标系是固定不变的,就是(0,0)到Canvas的宽高......
  • Wavelets
    Theinformationofinterestisoftenacombinationofphenomenathataretransient(e.g.,spikeandactionpotentials)anddiffuse(e.g.,smalloscillationsan......
  • Python 自定义label clicked
    classMyQLabel(QtWidgets.QLabel):#自定义信号,注意信号必须为类属性clicked=QtCore.pyqtSignal()def__init__(self,parent=None):super......