Vue自定义长按指令

news2024/10/6 6:46:05

新建文件longpress.ts文件

// longpress.ts
import { DirectiveBinding } from 'vue'
const longpress = {
  beforeMount(el: any, binding: DirectiveBinding) {
    const cb = binding.value
    const duration = binding.arg || 800  // 长按等待时间

    let timer: number | null = null
    let isLongPress = false  // 记录是否触发长按

    const longPress = (e: TouchEvent) => {
      if (e.type === 'touchstart') {
        timer = window.setTimeout(() => {
          isLongPress = true
          if (typeof cb === 'function') cb(el) // 3. 回调函数
        }, +duration)
        return false
      } else if (e.type === 'touchmove') {
        if (isLongPress) {
          e.preventDefault() // 1. 阻止默认行为
        }
        // 2. 若移动了就不触发长按事件
        if (timer) {
          clearTimeout(timer)
          timer = null
        }
      } else if (e.type === 'touchend') {
        if (isLongPress) {
          e.preventDefault() // 1. 阻止默认行为
          isLongPress = false
        }
        if (timer) {
          clearTimeout(timer)
          timer = null
        }
        return false
      }
    }

    el.addEventListener('touchstart', longPress)
    el.addEventListener('touchmove', longPress)
    el.addEventListener('touchend', longPress)

    el['longPress'] = longPress
  },
  unmounted(el: any) {
    el.removeEventListener('touchstart', el['longPress'])
    el.removeEventListener('touchmove', el['longPress'])
    el.removeEventListener('touchend', el['longPress'])
  },
}

export default longpress

main.ts中引入并全局定义

// 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')

在组件中直接使用

// demo.vue
<template>
	<div v-for="item in msgs" :key="item.id">
        <img class="avatar" :src="item.icon" :data-id="item.id" v-longpress="onPress"/>
        <div class="name">{{ item.name }}</div>
    </div>
</template>

<script setup>
	import { ref } from "vue"
	const msgs = ref([
	  {"id":1,"name":"朱鸢","icon":"https://bbs-static.miyoushe.com/static/2024/03/18/d70f25b443df8029e05cd20a897126a6_7820117047572824878.png"},
	  {"id":2,"name":"艾莲","icon":"https://bbs-static.miyoushe.com/static/2023/11/03/060c8ba17ff372078dcf62d4d8b46d28_7229548510559384850.png"},
	  {"id":3,"name":"丽娜","icon":"https://bbs-static.miyoushe.com/static/2023/11/03/6ce65ace05f501e8f6af3616dea1c634_1107629373726729394.png"}
	])
	const onPress = (e) => {
		console.log("press", e, e.dataset.id)
	}
</script>

这个指令里有三点处理需要特别说明一下(对应代码注释里的序号):

  1. 浏览器中长按会有一些默认的行为(比如弹出菜单栏),那么就需要阻止掉这些行为的触发。在touchend并且判断是长按的情况下才阻止,防止在非长按时默认行为(比如滑动)也被阻止。在touchmove中也阻止,防止在长按后不松手的情况下滑动导致以下报错。
    在这里插入图片描述
  2. 若在长按触发前触发了移动事件,则清除长按监听。因为这个时候用户很可能只是想滑动页面,不需要触发长按事件。
  3. 长按触发后调用回调函数,将当前长按的目标元素传回。这个有很大作用,比如本文的示例,头像列表由数据循环渲染而成,每个头像都添加了长按事件,那么当前长按的是哪个,就需要有参数的回调了。由于在指令中无法通过以下形式传参,
    <div v-for="item in msgs" :key="item.id">
      <img :src="item.icon" v-longpress="onPress(item.id)"/> // 错误的传参方式 ❌
    </div>
    
    因此,我们在作用元素上添加自定义属性data-id,将id设置在此属性上。
    <div v-for="item in msgs" :key="item.id">
      <img :src="item.icon" :data-id="item.id" v-longpress="onPress"/> // 将参数设置在自定义属性上
    </div>
    
    当我们触发长按时,长按指令会回调当前元素,此时只需要通过e.dataset.id就可以获取到长按项对应的id了。如下图所示:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1836800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这些数据可被Modbus采集,你还不知道???

为什么要用Modbus采集模块 Modbus采集模块之所以被广泛使用&#xff0c;是因为它提供了标准化的通信协议&#xff0c;确保了不同设备间的兼容性。它支持多种通信方式&#xff0c;易于实现&#xff0c;并且能够适应不同的网络环境。Modbus模块能够收集和传输各种工业数据&#x…

从荒漠到绿洲:可视化技术助力可持续农业

运用图扑可视化技术优化荒漠农业管理&#xff0c;通过实时监控与数据分析提高土地资源利用和生产效率&#xff0c;实现生态可持续发展。

解决Java项目运行时错误:“Command line is too long”

在开发Java应用的过程中&#xff0c;你可能偶尔会遇到“Error running ‘Application’: Command line is too long”的问题。这是因为Java虚拟机&#xff08;JVM&#xff09;在启动时&#xff0c;如果传递给它的类路径&#xff08;classpath&#xff09;过长&#xff0c;超过了…

Docker overlay磁盘使用100%处理方法overlay 100%

一、问题描述 服务器上运行了几个docker容器,运行个一周就会出现overlay 100%的情况&#xff0c;经查找&#xff0c;是容器里生成了很多core.xxx的文件导致的。 二、解决方法 首先通过以下命令查看&#xff1a; df -h 可以看的overlay已经100%了&#xff0c;进入到/var/lib/d…

springmvc拦截器 和 异常拦截器

springmvc拦截器的配置使用&#xff1a; 自定义监听器实现HandlerInterceptor接口&#xff1a; 在springmvc的配置文件中引入自定义拦截器对象及拦截目标 拦截器的方法调用 自定义一个拦截器&#xff1a; Component public class LoginInterceptor implements HandlerIntercept…

系统架构设计师 - 操作系统(2)

操作系统 操作系统&#xff08;5-6分&#xff09;文件管理绝对路径与相对路径 ★索引文件 ★★★位示图 ★ 存储管理段页式存储 ★★★页式存储段式存储段页式存储&#xff08;了解&#xff09; 页面置换算法 ★ 微内核操作系统嵌入式操作系统 ★★★ 大家好呀&#xff01;我是…

基于Spring Boot的工具迭代

1. 申请git权限 2. git项目中点击我的-Settings-SSH Keys添加公钥 3. 公钥生成步骤 ssh-keygen -o -t rsa -b 4096 -C "your email" cd ~/.ssh/ cat id_rsa.pub 把公钥内容粘贴到SSH Keys 4. 创建本地分支git checkout -b branchname git远程仓库创建远程分支 …

vue部署宝塔nginx配置(获取用户ip地址、反代理访问api接口、websocket转发)

以下配置为我自己的需求&#xff0c;因人而异&#xff0c;如果只是单纯的前端非交互页面&#xff0c;可以不用修改配置。 代码及注释&#xff0c;如下&#xff1a; #解决vue-router设置mode为history&#xff0c;去掉路由地址上的/#/后nginx显示404的问题location / {proxy_htt…

单片机中的各个引脚有正负极之分吗?如果有RST是正极还是负极呢

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 一般情况说的正负极&…

【ajax基础02】URL详解

一&#xff1a;什么是URL 统一资源定位符(Uniform Resource Locator,缩写&#xff1a;URL),简称网址 二&#xff1a;URL组成 https://baidu.com/index.html 协议 https协议&#xff1a;超文本传输协议&#xff0c;规定了浏览器和服务第之间传输数据的格式 域名&#xff08;在…

人工智能技术应用笔记(十二):搭建自带大模型微信,完美对接GPT-4o,Kimi等大模型,智能体平台Coze也能接

许多朋友对如何搭建自己的微信机器人非常感兴趣。今天就来教大家如何操作。 一、 准备工作 一台电脑或者云服务器&#xff0c;对配置要求不高&#xff0c;一般的电脑就行 大模型API调用的Key&#xff0c;比如GPT-4o&#xff0c;Kimi&#xff0c;Deepseek&#xff08;不知道怎…

AV1:帧间预测(一)参考帧管理

​AV1中帧类型 在H.26X系列标准中&#xff0c;根据帧允许的预测模式可以将帧分为I帧、P帧和B帧&#xff0c;根据帧在码流中前后的参考关系又可以分为IRAP、RADL等。AV1也类似地将帧分为4种类型&#xff0c;在码流中用frame_type来标识帧类型。 KEY_FRAME&#xff1a;相当于IDR帧…

软件设计不是CRUD(22):在流式数据处理系统中进行业务抽象落地——设计思考

(接上文《软件设计不是CRUD(21):在流式数据处理系统中进行业务抽象落地——需求分析》) 那么思考到这里我们就能做一些关于设计思路的总结: 每一个独立的数据处理流,就是数据采集系统中的一个功能。这个功能具备一个静态的控制逻辑(当然控制逻辑也可以是动态的,本文不…

适配不同数据库厂商方案

背景 在对国产化数据有要求的时候&#xff0c;我们会做对 达梦、海量等数据库的配置。 有些SQL 以前没有写成标准SQL&#xff1b; 那么适配的时候怎么办呢&#xff1f;改成标准SQL。 如果不好改呢&#xff1f;比如SQL比较复杂等&#xff0c;需要判断 当前是哪个厂商的数据库…

MS1004激光测距用高精度时间测量(TDC)电路

品简述 MS1004 是一款高精度时间测量 (TDC) 电路&#xff0c;对比 MS1002 具 有更高的精度和更小的封装&#xff0c;适合于高精度小封装的应用领域。 MS1004 具有双通道、多脉冲的采样能力、高速 SPI 通讯、 多种测量模式&#xff0c;适合于激光雷达和激光测距。 主…

使用 swiper 轮播 echarts 图表,地图点击失效

问题 使用 swiper 轮播 echarts 图表&#xff0c;地图点击失效&#xff0c;伪代码如下 <Swiper><SwiperSlide>...</SwiperSlide>// 轮播中有地图<SwiperSlide><EchartsMap/></SwiperSlide><SwiperSlide>...</SwiperSlide> &…

洁盟超声波清洗机怎么样?2024爆款机型声波清洗机测评、一篇看懂

随着现在近视率的逐年上升&#xff0c;戴眼镜的人群越来越多&#xff01;当然他们也在面临着一个眼镜清洗的问题&#xff01;因为长期佩戴眼镜&#xff0c;镜框还有镜片上面都是会积累灰尘、油污、污垢以及细菌&#xff0c;脏脏的不仅令眼镜不美观&#xff0c;同时在长期的佩戴…

go 语言爬虫库goQuery 的详细使用(知乎日报详情页解析示例)

上一篇《uniapp小程序开发 | 从零实现一款影视类app 》实现了影视小程序的前端和后台接口&#xff0c;虽然包含了大多数小程序应有的知识&#xff0c;但基本还只是涉及网络接口和vue页面的设计。这里介绍下零一个有趣的练手项目&#xff0c;知乎日报。涉及详情页面的html解析&a…

MYSQL无法启动的修复过程

记录一次MySQ无法启动的修复过程。 1. 错误表现 今天在用python操作数据库时可能有些错误&#xff08;具体来说就是我尝试创建了一个已经存在的database&#xff09;&#xff0c;结果我发现MySQL中的那个database不存在了&#xff0c;我重启了一下电脑&#xff0c;结果mysql…

移植案例与原理 - build lite配置目录全梳理

命令行工具hb(HarmonyOS|OpenHarmony Build 编译构建系统的缩写)都很熟悉了。这是一个基于gn和ninja的构建系统&#xff0c;以支持OpenHarmony组件化开发为目标&#xff0c;提供以下基本功能&#xff1a; 支持按组件拼装产品并编译。 独立构建芯片解决方案厂商源码。 独立构建…