小程序向左滑动删除功能

244 阅读3分钟

功能介绍

  • 该功能就是使用小程序的触摸事件,这些事件,可以绑定到view中操作
  bindtouchstart="touchStart"   //手指触摸动作开始
  bindtouchend="touchEnd" 	    //手指触摸动作结束
  bindtouchcancel="touchCancel" //手指触摸动作被打断,如来电提醒,弹窗
  bindtouchmove="touchmove"		//手指触摸后移动
  bindlongtap="longtap"			//手指长按 500ms 之后触发,触发了长按事件后进行移动不会触发屏幕的滚动
  binderror="error"				//当发生错误时触发 error 事件,detail = {errMsg}

滑动效果主要使用了,开始、移动、结束这三个事件。

  • 触摸开始: 时获取当前触摸的模块的下标以及起始距离
  • 移动过程中获取每次移动的距离差并赋值到data保存数据,这样就有了移动效果
  • 触摸结束时判断保存的数据大于我们预期的就改为我们预期的,小于我们预期的就改为最小值(0)我是设为0

代码模块

  • 模板
<view class="per-row" style="background-color: #f8f9fd;">
  <view class="per-info-items"wx:for="{{visitList}}" wx:key="id" 
  bindtouchstart="touchStart" 
  bindtouchend="touchEnd" 
  bindtouchcancel="touchCancel"
  bindtouchmove="touchmove"
  data-index="{{index}}"
  >
    <view class="info" style="transform:translateX({{item.left+'rpx'}});"> #这个样式是控制整体模块移动的
      <view class="info-top" style="width:480rpx;position:relative;padding-bottom:40rpx;">
        <view class="info-center" style="font-size:30rpx;margin-right:25rpx;display: block;" >
        {{item.content}}
        </view>
        <view class="info-bottom" style="position:absolute;bottom:0;">
          <text class="time" style="font-size: 24rpx;color:#666;">走访时间:{{item.create_time}}</text>
        </view>
      </view>
      <view  data-index="{{index}}" catchtap="delItem" class="inner del">删除</view>
    </view>
  </view>
</view>
  • 样式
.del{
  width: 160rpx;
  height: 160rpx;
  text-align: center;
  line-height: 160rpx;
  background-color: red;
  position: absolute;
  right: -160rpx;
  border-radius: 15rpx;
}
  • 逻辑
 data: {
    visitList:[],
    Mstart:'',
    More:'',
    Mend:'',
    Mindex:'',
    sub:2
  },
  /**
   * 触摸开始事件,初始化startX、startY和startTime
   */
  touchStart: function (e) {
    this.setData({
      Mstart:e.changedTouches[0].pageX, //开始距离
      Mindex:e.currentTarget.dataset.index //当前点击的那条数据
    })
  },
  /**
   * 滑动
   */
  touchmove(e){
    const that = this
    let moreL = this.data.Mstart - e.changedTouches[0].pageX //计算滑动距离
    let list = this.data.visitList 
    let Mindex = this.data.Mindex //点击时,赋值到data中的当前下标,现在取出来操作
    
    //在触摸结束后,数据存储的等于-160时,将执行这里的判断,-160就说明按钮已经是拉出的了,所以要开始拉回去
    if (this.data.flag) {
    
      // 存储的距离减去滑动的距离,由于距离比较大,想让它慢一点回去,所以这里做处理,sub每次滑动都会自增
      list[Mindex].left = list[Mindex].left - (moreL / this.data.sub)
      this.setData({
        visitList:list,
        sub: this.data.sub+1  //sub每次滑动都会自增,在触摸接触后,重新把它赋值为2
      })
      return false //return false只会执行这里的代码,下面的不执行
    }

    list[Mindex].left =  -moreL //如果是向左拉就是拉出来按钮,所以无需限制,尽管让他赋值,在触摸结束后做判断即可
    this.setData({
      visitList:list
    })
  },
  
  /**
   * 触摸结束事件,主要的判断在这里
   */
  touchEnd: function (e) {
    let list = this.data.visitList  //渲染的数组,这里是用来存储修改数据用
    let lastMore = this.data.Mstart - e.changedTouches[0].pageX //最终的距离
    
    list[this.data.Mindex].left = lastMore >= 50?-160:0  //利用只要距离大于等于50就可以把它全部拉出来了,否则为0
    this.setData({
      visitList:list, //修改了数据就需要把它重新赋值
      sub:2  //这是为了给触摸滑动时,做限制用的
    })
    
    //这里判断当left是-160的就说明按钮已经是拉出来的,这里需要赋值是为了我们做上面的操作
    if (list[this.data.Mindex].left == -160) {
      this.setData({
        flag:true 
      })
      return false
    }
  },

复制代码可能是无法运行的,这里只是讲解一下