效果展示
效果描述
长按【大于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 的 ID
let hasShownDeleteDialog = false; // 标记是否已弹出删除对话框
const touchstart = (item) => {
seconds.value = 0; // 重置秒数
hasShownDeleteDialog = false; // 重置标记
timeoutId = setTimeout(() => {
showDeleteDialog(item);
}, 1000);
};
const touchend = (item) => {
clearTimeout(timeoutId); // 清除 setTimeout
if (!hasShownDeleteDialog) {
handleDetail(item);
}
seconds.value = 0; // 重置秒数
};
const showDeleteDialog = (item) => {
hasShownDeleteDialog = true; // 设置标记为已弹出删除对话框
clearInterval(timeoutId); // 清除 setTimeout
uni.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('用户点击取消');
}
}
});
};