uniapp实现左滑删除功能

 

 

<delSlideLeft :item="item"  :data_transit="{index:index,item:item}"  @delItem="delItem">
</delSlideLeft>



<template>
    <view>
        <view class="box-slideLeft" >
            <view class="touch-item touch-slideLeft " @touchstart="touchS" @touchmove="touchM" @touchend="touchE"  :style="item_show.txtStyle">
                <slot />
            </view>
            
            <view class="touch-item del-box-touch-slideLeft cf-shuCenter"  @click="delItem(item_show)">
                <view class="iconfont icon-shanchu"></view>
            </view>

        </view>
    </view>
</template>

<script>
    
    export default {
        components: {

        },
        props: {
            
            data_transit: {
                type: Object,
                default () {
                    return {}
                }
            },
            //可不传参
            item: {
                type: Object,
                default () {
                    return {}
                }
            },
        },
        computed: {

        },
        
        data() {
            return {
                
                item_show : {},
                delBtnWidth: 90, //删除按钮宽度单位(rpx)
                startX: '',
            };
        },
        created:function(){
            //专门处理检查对象中,某字段是否存在的,如果存在返回 true 不存在返回 false
            let that = this ;
            let item = that.item ;
            if(!item.hasOwnProperty("txtStyle")){
                this.$set(this.item,'txtStyle','');//不需要初始化了
            }
            this.item_show = this.item ;
        },
        watch: {
            item(e){
                this.item_show = e ;
            },
        },
        methods: {
            //点击删除按钮事件
            delItem: function(e) {
                let that = this;
                let data ={
                    item : e ,
                    data : that.data_transit ,
                };
                this.item_show.txtStyle = "left:-" + 0 + "px";
                this.$forceUpdate()
                this.$emit('delItem', data);
            },
            touchS: function(e) {
                let that = this;
                
                if (e.touches.length == 1) {
                    //设置触摸起始点水平方向位置
                    this.startX = e.touches[0].clientX
                    
                }
            },
            touchM: function(e) {
                let that = this;
                
                if (e.touches.length == 1) {
                    //手指移动时水平方向位置
                    var moveX = e.touches[0].clientX;
                    //手指起始点位置与移动期间的差值
                    var disX = this.startX - moveX;
                    var delBtnWidth = this.delBtnWidth;
                    var txtStyle = "";
                    if (disX == 0 || disX < 0) { //如果移动距离小于等于0,说明向右滑动,文本层位置不变
                        txtStyle = "left:0px";
                    } else if (disX > 0) { //移动距离大于0,文本层left值等于手指移动距离
                        txtStyle = "left:-" + disX + "px";
                        if (disX >= delBtnWidth) {
                            //控制手指移动距离最大值为删除按钮的宽度
                            txtStyle = "left:-" + delBtnWidth + "px";
                        }
                    }
                    //获取手指触摸的是哪一项
                    
                    that.item_show.txtStyle = txtStyle;
                    this.$forceUpdate()
                    
                }
            },
            touchE: function(e) {
                let that = this;
                if (e.changedTouches.length == 1) {
                    //手指移动结束后水平位置
                    var endX = e.changedTouches[0].clientX;
                    //触摸开始与结束,手指移动的距离
                    var disX = this.startX - endX;
                    var delBtnWidth = this.delBtnWidth;
                    //如果距离小于删除按钮的1/2,不显示删除按钮
                    var txtStyle = disX > delBtnWidth / 2 ? "left:-" + delBtnWidth + "px" : "left:0px";
                    //获取手指触摸的是哪一项
                    that.item_show.txtStyle = txtStyle;
                    
                }
            },
            
        }

    }
</script>

<style lang="scss">
    @import './iconfont.css';//便于有删除图标
    
    .box-slideLeft {
        view {
            box-sizing: border-box;
        }
        position: relative;
        overflow: hidden;
        
        .touch-item {
            position: absolute;
            top: 0;
            padding: 20rpx 32rpx 20rpx;
            background-color: #FFFFFF;
            // border-radius: 10px;
            overflow: hidden;
        }
        
        .touch-slideLeft {
            position: relative;
            width: 100%;
            z-index: 5;
            transition: left 0.2s ease-in-out;
            // white-space: nowrap;
            // overflow: hidden;
            // text-overflow: ellipsis;
        }
        .del-box-touch-slideLeft {
            right: 0;
            float: left;
            width: 92 * 2rpx;
            height: 67 * 2rpx;
            line-height:134rpx;
            background-color: #EA5863;
            // border-radius: 0 10px 10px 0;
            color: #fff;
            font-size: 36rpx;
            font-weight: lighter;
            text-align: center;
            margin-top:20rpx;
        }
        .icon-shanchu{
            font-size: 44upx;
        }
        
        .cf-shuCenter{
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            
        }
        
        .icon-shanchu:before{
            content: '删除';
            font-size: 28rpx;
        }
    }

    
</style>

 

posted @ 2023-08-07 09:56  奔向太阳的向日葵  阅读(356)  评论(0编辑  收藏  举报