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

2023-12-15 05:31:29

偶然间看到一个在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()
          },(binding.arg ? Number(binding.arg) : 0.5) * 1000) //默认长按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>

文章来源:https://blog.csdn.net/lwf3115841/article/details/134936538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。