效果展示
效果描述
长按【大于1s】某一条对话框会弹出一个对话框,点击确定按钮就可以将当前对话框从列表中进行删除,如果点击取消则不做额外操作。
如果只是点击了一下,时间【小于1s】的情况下会直接引入到与该用户的对话框详情页面。
代码实现
渲染层代码
<view v-for="(item,index) in dialogList" :key="index" class="m-item" @touchstart="touchstart(item)"@touchend="touchend(item)"><view class="mi-left"><image :src="userId==item.msgSendId? item.msgRevHeadImg:item.msgSendHeadImg" mode="aspectFill"></image><view class="mil-num" v-if="item.readNum!=0">{{item.readNum>99?'99+':item.readNum}}</view></view><view class="mi-right"><view class="mir-top"><text class="mirt-name danhang">{{item.msgSendName}}</text><text style="color: rgba(16,16,16,0.7);">{{formatTime(item.createTime)}}</text></view><text class="danhang">{{formatType(item.textType,item)}}</text></view></view>
逻辑层代码
let seconds = ref(0); // 用于跟踪经过的秒数let timeoutId = null; // 存储 setTimeout 的 IDlet hasShownDeleteDialog = false; // 标记是否已弹出删除对话框const touchstart = (item) => {seconds.value = 0; // 重置秒数hasShownDeleteDialog = false; // 重置标记timeoutId = setTimeout(() => {showDeleteDialog(item);}, 1000);};const touchend = (item) => {clearTimeout(timeoutId); // 清除 setTimeoutif (!hasShownDeleteDialog) {handleDetail(item);}seconds.value = 0; // 重置秒数};const showDeleteDialog = (item) => {hasShownDeleteDialog = true; // 设置标记为已弹出删除对话框clearInterval(timeoutId); // 清除 setTimeoutuni.showModal({title: `删除对话框`,content: `你确定要删除与【${item.msgSendName}】的对话框吗,删除后将无法恢复!!!`,success: function(res) {if (res.confirm) {console.log('用户点击确定', item);http.post(api.removeChatRecord, { revUserId: item.msgRevId, sendUserId: item.msgSendId }).then(res => {getDialogList();uni.showToast({icon: "none",title: "删除成功"})});} else if (res.cancel) {console.log('用户点击取消');}}});};