uniapp 图片长按会之后会出现默认菜单,移动端会出现复制、分享等。我是直接封装成一个图片组件,长按和点击会触发不同的事件类型,图片组件如下:
javascript
<template>
<view>
<image v-bind="$attrs" @touchstart="imgTouchStart" @touchend="imgTouchEnd"></image>
</view>
</template>
<script setup>
const props = defineProps({
time:{//触发长按逻辑的时常,单位ms
type:Number,
default:800
},
stop:{//是否需要组织冒泡
type:Boolean,
default:true
}
})
const emits = defineEmits(['customerClick'])
let pressTimer = null;
let longPressTriggered = false;
const imgTouchStart = e => {
e && e.preventDefault()
if(props.stop){
e && e.stopPropagation()
}
longPressTriggered = false;
pressTimer = setTimeout(() => {
longPressTriggered = true;
emits('customerClick',{type:'longpress'})
}, props.time);
}
const imgTouchEnd = (e) => {
if(props.stop){
e && e.stopPropagation()
}
pressTimer && clearTimeout(pressTimer);
if (!longPressTriggered) {
emits('customerClick',{type:'click'})
}
}
</script>
<style>
</style>
使用如下:
javascript
<template>
//组件名称自定义
<sbtImage class="image no-select" :src="src" @customerClick="data=>imageClick(data,item)"></sbtImage>
</template>
<script setup>
const imageClick = (e,data) => {
if(e.type == 'longpress'){
//长按事件的处理逻辑
}else if(e.type == 'click'){
//点击事件的处理逻辑
}
}
</script>