列表页右滑删除事件
效果:
WXML代码
<view class='mt20'>
<view class='address-list dflex {{index== isTouchMove? "touch-move-active" : ""}}' wx:for="{{listData}}" wx:key='{{item.id}}' bindtouchstart='TouS' bindtouchmove='TouM' catchtouchend='TouE' data-index='{{index}}' bindtap='setSiteMessage'>
<view class='content'>
<view class='flex-1 list-left'>
<view class='col-ui-font32 ml32'>{{item.address}}
</view>
<view class='mt20 c9 col-ui-font26 ml32'>{{item.name}}
<text class='left-top'>{{item.phone}} </text>
</view>
</view>
<view>
<icon class='iconfont iconedit list-icon' data-minipath="/pages/address/add-site?id={{item.id}}&status={{item.defaultVal}}" catchtap='miniPageChange'></icon>
</view>
</view>
<view class='del' catchtap='delAddress' data-id='{{item.id}}'>
删除
</view>
</view>
</view>
JS代码
const app = getApp();
import address from "../../api/address.js"
Page({
/**
* 页面的初始数据
*/
data: {
loaded: false,
listData: {},
isTouchMove: -1,
communityId: '', //小区id
timer:null
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function() {
this.getlistData();
},
//获取周边人气店铺列表
getTopshoplistData() {
// app.loadingTip()
const data = {
communityId: this.data.communityId,
type: this.data.listType
}
Buy.myOrShopAddress(data).then(res => {
if (res.success) {
this.setData({
listLength: res.d.list.length,
});
}
}).catch(res => {
// console.error(err);
})
},
getlistData() {
app.loadingTip()
address.addressSearch().then(res => {
if (res.success) {
res.d.forEach(item => {
item.touchFlag = 120
})
this.setData({
loaded: true,
listData: res.d
})
}
wx.hideLoading()
}).catch(res => {
wx.hideLoading()
app.commonTip(res)
})
},
delAddress(e) { //删除地址
const id = e.currentTarget.dataset.id
const that = this
this.setData({
isTouchMove: -1
})
wx.showModal({
title: '提示',
content: '是否删除',
success: function(res) {
if (res.confirm) {
address.getDeleteAddress(id).then(res => {
// console.log(res)
if (res.success) {
app.successTip('删除成功')
}
setTimeout(() => {
that.getlistData()
}, 200)
}).catch(res => {
console.log(res)
})
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
},
TouS(e) { //用户手指触摸
var index = e.currentTarget.dataset.index
if (e.touches.length == 1) {
this.setData({
startX: e.touches[0].clientX,
startY: e.touches[0].clientY,
})
}
},
TouM(e) { //用户拖动
var index = e.currentTarget.dataset.index
// console.log(index)
if (e.touches.length == 1) {
let moveX = e.touches[0].clientX;
let moveY = e.touches[0].clientY;
let disX = this.data.startX - moveX;
let disY = this.data.startY - moveY;
const isScrolling = Math.abs(disX) < Math.abs(disY) ? 1 : 0;
//isScrolling为1时,表示纵向滑动,0为横向滑动
if (disX > 30 && isScrolling == 0) {
this.setData({
isTouchMove: index
})
// flag = false
} else if (disX < 0 && index == this.data.isTouchMove) {
if (isScrolling == 0) {
this.setData({
isTouchMove: -1
})
// flag = true
}
}
}
// return false
},
TouE(e) {
var index = e.currentTarget.dataset.index;
if (this.data.disX < 120) {
this.setData({
isTouchMove: -1
})
}
}
})
WXSS代码
.address-list {
position: relative;
display: flex;
width: 100%;
overflow: hidden;
justify-content: space-between;
padding: 30rpx 0;
box-sizing: border-box;
background: #fff;
border-bottom: 2rpx solid #e8e9ea;
}
.mt20 :last-child{
border: none;
}
.content {
width: 100%;
position: relative;
margin-left: -120rpx;
transform: translateX(120rpx);
-webkit-transform: translateX(120rpx);
transition: all 0.4s;
-webkit-transition: all 0.4s;
}
.del {
background-color: orangered;
position: absolute;
top: 0;
right: 0;
height: 100%;
width: 120rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #fff;
-webkit-transform: translateX(120rpx);
transform: translateX(120rpx);
-webkit-transition: all 0.4s;
transition: all 0.4s;
}
.touch-move-active .content, .touch-move-active .del {
-webkit-transform: translateX(0);
transform: translateX(0);
}
.list-left {
padding-right: 124rpx;
box-sizing: border-box;
font-weight: 400;
}
.list-icon {
position: absolute;
top: 0rpx;
right: 32rpx;
font-size: 42rpx;
}
.list-icon2 {
position: absolute;
top: 20rpx;
right: 32rpx;
font-size: 42rpx;
}
.message {
position: absolute;
top: 30%;
left: 50%;
text-align: center;
transform: translateY(-30%) translateX(-50%);
color: #999;
}
.message image {
display: block;
font-size: 0;
width: 355rpx;
height: 338rpx;
}
.message .text {
margin-top: 40rpx;
}
.mt20{
margin-top: 20rpx;
background-color: #fff;
}
.ml32{
margin-left: 32rpx;
}
.col-ui-font32{
font-weight: 600;
}