使用微信小程序自帶視圖容器組件
movable-area
描述: 可移動的視圖容器栓撞,在頁面中可以拖拽滑動。movable-view必須在 movable-area 組件中碗硬,并且必須是直接子節(jié)點瓤湘,否則不能移動。
JS
Page({
data: {
cardList:[
{ id:1, name:'card1', },
{ id:2, name:'card2', },
{ id:3, name:'card3', },
{ id:4, name:'card4', },
]
},
/** 點擊刪除 */
handleDelete(e) {
let {id} = e.currentTarget.dataset;
this.itemDel(id)
},
/** 刪除邏輯 */
itemDel(id){
this.data.cardList.forEach((item,index)=>{
if(item.id==id){
this.data.cardList.splice(index,1)
}
this.setData({
cardList:this.data.cardList
})
wx.showToast({
title: '刪除成功',
icon:'success'
})
})
},
/** 處理touchstart事件 */
handleTouchStart(e) {
this.startX = e.touches[0].pageX
},
/** 處理touchend事件 */
handleTouchEnd(e) {
if (e.changedTouches[0].pageX < this.startX && e.changedTouches[0].pageX - this.startX <= -30) {
this.showDeleteButton(e)
} else if (e.changedTouches[0].pageX > this.startX && e.changedTouches[0].pageX - this.startX < 30) {
this.showDeleteButton(e)
} else {
this.hideDeleteButton(e)
}
},
/** 顯示刪除按鈕 */
showDeleteButton: function (e) {
let index = e.currentTarget.dataset.index;
this.setXmove(index, -65);
// 其它復(fù)位
let {cardList} = this.data;
if (cardList.length > 0) {
cardList.forEach((item,itemIndex) => {
if (index != itemIndex && cardList[itemIndex].xmove != 0) {
this.setData({
['cardList['+itemIndex+'].xmove']: 0
});
}
});
}
},
/** 隱藏刪除按鈕 */
hideDeleteButton: function (e) {
let index = e.currentTarget.dataset.index;
this.setXmove(index, 0);
},
/** 設(shè)置movable-view位移 */
setXmove: function (index, xmove) {
let {cardList} = this.data;
cardList[index].xmove = xmove;
this.setData({
cardList: cardList
})
},
/** 處理movable-view移動事件 */
handleMovableChange: function (e) {
if (e.detail.source === 'friction') {
if (e.detail.x < -30) {
this.showDeleteButton(e)
} else {
this.hideDeleteButton(e)
}
} else if (e.detail.source === 'out-of-bounds' && e.detail.x === 0) {
this.hideDeleteButton(e)
}
},
})
wxml
<view class="con">
<block wx:for="{{cardList}}" wx:key="index">
<view class="top" >
<movable-area>
<movable-view out-of-bounds="true" direction="horizontal" x="{{item.xmove}}" inertia="true"
data-index="{{index}}" bindtouchstart="handleTouchStart" bindtouchend="handleTouchEnd"bindchange="handleMovableChange">
<view>{{item.name}}</view>
</movable-view>
</movable-area>
<view class="movable_delete_btn" data-id="{{item.id}}" bindtap="handleDelete">刪除</view>
</view>
</block>
</view>
wxss
.con{
width: 100%;
box-sizing: border-box;
padding: 0 20 rpx 20rpx 20rpx;
}
.top{
margin: 20rpx auto;
width: 710rpx;
height: 200rpx;
background: #FFFFFF;
border-radius: 20rpx;
line-height:200rpx;
text-align:center;
display: flex;
/* 添加此屬性 不會劃出界面 */
overflow-x: hidden
}
movable-view{
width: 710rpx;
height: 200rpx;
background: #FFFFFF;
border-radius: 20rpx;
line-height:200rpx;
text-align:center;
}
movable-area{
height: 200rpx;
background: #FFFFFF;
border-radius: 20rpx;
line-height:200rpx;
text-align:center;
width: calc(710rpx - 115rpx);
}
.movable_delete_btn {
width: 115rpx;
font-size: 24rpx;
font-weight: 600;
color: #FFFFFF;
background: red;
border-top-right-radius: 20rpx;
border-bottom-right-radius: 20rpx;
}