uniapp的touchstart与click

移动端的执行顺序:touchstart->``touchmove->``touchend->click

需求:点击消息查看详情,长按消息执行删除操作

点击事件正常触发,触摸事件正常触发,不会互相影响

问题:再执行删除操作的时候会连带点击事件一起执行

当使用@touchstart.prevent的时候不会触发click事件,但正常点击事件也不生效了

当使用@touchstart.stop的时候不生效

在函数里使用e.preventDefault()也不生效,

最后看到一篇文章用变量判断,所以最后决定使用变量判断

javascript 复制代码
<template>
	<view>
		<!-- 消息 -->
		<view v-for="(item,index) in messagelist" :key="index" class="uni-message" @click="messageCountFn(item)" @touchstart="touchstart(item.id)"   @touchend="touchend">
			<uni-badge class="uni-badge-left-margin" :is-dot="item.messageStatus == 0" :text="item.messageStatus == 0?1:0" absolute="rightTop" size="small">
				<view  class="uni-img">
					<image src="@/static/other/messages.png" mode=""></image>
				</view>
			</uni-badge>
			
			<view class="uni-counts">
				<view class="uni-top uni-def">
					<text class="mees">{{item.title}}</text>
					<text>{{item.createTime}}</text>
				</view>
				<view class="uni-top">
					<text>{{item.content}}</text>
				</view>
			</view>
		</view>
		<view class="uni-nomessage" v-if="messagelist.length == 0">
			<image src="/static/other/nomessage.png" mode=""></image>
			<view class="text">暂无消息</view>
		</view>
		<!-- tabbar -->
		<tabbar  v-if="loadingTab"/>
	</view>
</template>

<script setup>
import {ref} from 'vue'
import useUserStore from '@/store/user.js'
import { API_URL } from '@/commponents/request/env'
import tabbar from '@/commponents/tabbar/tabbar.vue'
import api from '@/commponents/request/index';
import {onShow,onPullDownRefresh } from "@dcloudio/uni-app";
// tab---pina
let useStore = useUserStore()
const messagelist = ref([])
const Loop = ref([])
// 控制tabbar显示
const loadingTab = ref(false)
// 判断是否是点击事件
const isClick = ref(true)
// 新消息数量
let messagenum = ref(0)
// 初始化函数
const showFn = ()=>{
	messagenum.value = 0
	loadingTab.value = false
	api('wx.getMessageList',{
		PageIndex:1,
		PageSize:999
	}).then(res=>{
		uni.stopPullDownRefresh()
		messagelist.value = res.data.rows
		res.data.rows.forEach(item=>{
		 if(item.messageStatus == 0){
			 // 新消息数量
			 messagenum.value++
		 }
		})
		// 存到pina里面
		useStore.setMessagenum(messagenum.value)
		loadingTab.value = true
	})
}
onShow(()=>{
	showFn()
})

// 下拉刷新
onPullDownRefresh(async ()=>{
	await showFn()
	
})
// 点击消息进入详情页
const messageCountFn = (item)=>{
	if(isClick.value){
		uni.navigateTo({
			url: '/pages/message/messagecount?id='+item.id
		});
	}
}
// 开始触摸---用于删除消息
const touchstart = (id)=> {
	isClick.value = true
	clearInterval(Loop.value); //再次清空定时器,防止重复注册定时器
	Loop.value = setTimeout(function() {
		isClick.value = false
		uni.showModal({
			title: '删除',
			content: '请问要删除本条消息吗?',
			success: function(res) {
				if (res.confirm) {
					uni.request({
						url:`${API_URL}/client/delMessage?id=${id}`,
						header: {Authorization:'Bearer ' + uni.getStorageSync('token')},
						method:'DELETE',
						success(res){
							if(res.data.statusCode == 200){
								uni.showToast({
									title: '删除成功',
									duration: 2000
								})
								showFn()
							}
							
						}
					})
				} else if (res.cancel) {
					
				}
			}
		});
	}.bind(), 1000);
}
// 触摸结束---用于删除消息
const touchend = ()=> {
	clearInterval(Loop.value);
}
</script>


<style lang="scss">
	.uni-nomessage{
		text-align: center;
		margin-top: 122rpx;
		box-sizing: border-box;
		.text{
			color: #999999;
		}
		image{
			    width: 153px;
			    height: 130px;
		}
	}
	.uni-message{
		display: flex;
		margin:10px;
		border-bottom: 1px solid #ccc;
		padding-bottom: 10px;
		// justify-content: space-evenly;
		.uni-img{
			    width: 41.5px;
			    height: 41.5px;
				border-radius: 10px;
				image{
					 width: 41.5px;
					 height: 41.5px;
				}
		}
		.uni-counts{
			width: 80%;
			margin-left: 10px;
			.uni-def{
				margin-bottom: 5px;
			}
			.uni-top{
				display: flex;
				justify-content: space-between;
				text{
					    width: 80vw;
					    display: inline-block;
					    overflow: hidden;
					    white-space: nowrap;
					    text-overflow: ellipsis;
					font-family: Source Han Sans CN;
					font-size: 14px;
					font-weight: normal;
					line-height: normal;
					text-align: left;
					letter-spacing: 0em;
					color: #999999;
				}
				.mees{
					color: #000;
					font-size: 15px;
					font-weight: 400;
				}
			}
		}
	}
	
</style>
相关推荐
2501_915909068 小时前
iOS APP 抓包全流程解析,HTTPS 调试、网络协议分析与多工具组合方案
android·ios·小程序·https·uni-app·iphone·webview
2501_915106328 小时前
游戏上架 App Store 的技术流程解析 从构建到审核的全流程指南
游戏·macos·ios·小程序·uni-app·cocoa·iphone
行云流水62618 小时前
uniapp pinia实现数据持久化插件
前端·javascript·uni-app
zhangyao94033018 小时前
uniapp动态修改 顶部导航栏标题和右侧按钮权限显示隐藏
前端·javascript·uni-app
2501_9160074721 小时前
iOS 压力测试的工程化体系,构建高强度、多维度、跨工具协同的真实负载测试流程
android·ios·小程序·uni-app·cocoa·压力测试·iphone
2501_916008891 天前
API接口调试全攻略 Fiddler抓包工具、HTTPS配置与代理设置实战指南
前端·ios·小程序·https·fiddler·uni-app·webview
2501_915921431 天前
iOS 开发者工具推荐,构建从调试到性能优化的多维度生产力工具链(2025 深度工程向)
android·ios·性能优化·小程序·uni-app·iphone·webview
00后程序员张1 天前
全面解析网络抓包工具使用:Wireshark和TCPDUMP教程
网络·ios·小程序·uni-app·wireshark·iphone·tcpdump
游戏开发爱好者81 天前
Mac 抓包软件怎么选?从 HTTPS 调试、TCP 数据流分析到多工具协同的完整抓包方案
tcp/ip·macos·ios·小程序·https·uni-app·iphone
2501_915918411 天前
苹果上架 iOS 应用的工程实践,一次从零到上线的完整记录
android·ios·小程序·https·uni-app·iphone·webview