You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.3 KiB
203 lines
4.3 KiB
<!-- 向左滑动 右边出现操作按钮 -->
|
|
<template>
|
|
<view class="wrapper">
|
|
<view :style="[Tactive == index ? leftStyle : '']" class="item-view" @touchstart="touchStart($event, index)"
|
|
@touchmove="touchMove($event, index)" @touchend="touchEnd($event, index)"
|
|
@click="itemClick(itemData, index)">
|
|
<slot></slot>
|
|
</view>
|
|
|
|
<view :style="[Tactive === index ? rightStyle : '']" class="s-btn-box">
|
|
<view class="s-btn" @click.stop="editoperation(itemData)"><text class="iconfont icon-edit"></text></view>
|
|
|
|
<view class="s-btn s-btn-red" @click.stop="deleteoperation(itemData)"><text class="iconfont icon-trashcan"></text></view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
// item 数据
|
|
itemData: {},
|
|
|
|
// item 下标
|
|
index: {
|
|
type: Number,
|
|
default: 0
|
|
},
|
|
// 是否允许滑动
|
|
isSlide: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
startX: null, //起始位置
|
|
startM: null,
|
|
startE: null, //结束位置
|
|
left: null,
|
|
deleteBtn: 240,
|
|
leftStyle: {},
|
|
rightStyle: {},
|
|
Tactive: 0
|
|
};
|
|
},
|
|
methods: {
|
|
editoperation(item) {
|
|
this.init();
|
|
this.$emit('operationCallBack', {
|
|
item: item,
|
|
action: "edit"
|
|
});
|
|
},
|
|
deleteoperation(item) {
|
|
this.init();
|
|
this.$emit('operationCallBack', {
|
|
item: item,
|
|
action: "remove"
|
|
});
|
|
},
|
|
|
|
itemClick(item, index) {
|
|
this.leftStyle = {};
|
|
this.rightStyle = {};
|
|
var lastIndex = uni.getStorageSync('lastSlideIndex');
|
|
this.$emit('itemClickCallBack', {
|
|
lastSlideIndex: lastIndex,
|
|
index: index,
|
|
item: this.itemData
|
|
});
|
|
},
|
|
|
|
init() {
|
|
this.leftStyle = {};
|
|
this.rightStyle = {};
|
|
},
|
|
|
|
touchStart(e, index) {
|
|
if (!this.isSlide) {
|
|
//不允许滑动
|
|
return;
|
|
}
|
|
this.Tactive = index;
|
|
this.startX = e.touches[0].clientX;
|
|
var lastIndex = uni.getStorageSync('lastSlideIndex');
|
|
this.$emit('itemTouchStart', {
|
|
lastSlideIndex: lastIndex,
|
|
item: this.itemData
|
|
});
|
|
},
|
|
touchMove(e, index) {
|
|
if (!this.isSlide) {
|
|
//不允许滑动
|
|
return;
|
|
}
|
|
this.startM = e.touches[0].clientX;
|
|
this.left = this.startM - this.startX;
|
|
if (this.left > this.deleteBtn) {
|
|
//右滑 注意: 这里的100,是与删除div的width保持一致;
|
|
// this.left = this.deleteBtn; //转成正数
|
|
// this.left = 0;
|
|
}
|
|
|
|
//左滑
|
|
if (this.left < -this.deleteBtn) {
|
|
this.left = -this.deleteBtn; //转成正数
|
|
this.rightStyle = {
|
|
left: this.left + 'px'
|
|
};
|
|
var temp = this.deleteBtn + this.left;
|
|
this.leftStyle = {
|
|
left: temp + 'px'
|
|
};
|
|
}
|
|
},
|
|
touchEnd(e, index) {
|
|
if (!this.isSlide) {
|
|
//不允许滑动
|
|
return;
|
|
}
|
|
if (this.left < this.deleteBtn) {
|
|
//鼠标松开时, 如果长度小于.delete的width;
|
|
this.left = -240;
|
|
this.leftStyle = {
|
|
left: this.left + 'rpx'
|
|
};
|
|
var temp = 0;
|
|
this.rightStyle = {
|
|
right: temp + 'px'
|
|
};
|
|
uni.setStorageSync('lastSlideIndex', index);
|
|
this.$emit('itemTouchEnd', {
|
|
index: index,
|
|
item: this.itemData
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.wrapper {
|
|
width: 100%;
|
|
height: 170rpx;
|
|
font-size: 14px;
|
|
overflow: hidden;
|
|
display: flex;
|
|
position: relative;
|
|
|
|
.item-view {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
align-items: center;
|
|
/* padding: 0 30rpx; */
|
|
width: 100%;
|
|
height: 100%;
|
|
background: #fff;
|
|
color: black;
|
|
position: absolute;
|
|
left: 0;
|
|
z-index: 3;
|
|
transition: all 0.5s;
|
|
}
|
|
|
|
.s-btn-box {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
align-items: center;
|
|
position: absolute;
|
|
right: 0px;
|
|
// width: 200rpx;
|
|
width: 240rpx;
|
|
height: 100%;
|
|
background: #ffffff;
|
|
color: #fff;
|
|
text-align: end;
|
|
transition: all 0.5s;
|
|
}
|
|
|
|
.s-btn {
|
|
width: 120rpx;
|
|
height: 150rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: #CCCCCC;
|
|
}
|
|
|
|
.s-btn .iconfont {
|
|
font-size: 42rpx;
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.s-btn-red {
|
|
background: #ED4242;
|
|
}
|
|
}
|
|
</style>
|