react 移动端实现列表左滑删除的示例代码


Posted in Javascript onJuly 04, 2019

最近做了一个类似系统操作的左滑删除的demo,用的taro框架,和大家分享一下~

首先需要考虑的有以下几点:

1)布局;
2)判断是左滑还是右滑,左滑时出现删除,右滑时回归原位;
3)排他性,意思是某一个时间只能有一个项出现删除,当有另一个出现删除时,上一个自动回归原位。

我将列表项封装成一个组件,而整个列表是另一个组件。

接下来先说列表项这个组件,逐一解决以上这些问题:

1)布局

我采用的是列表项最外层套一个盒子,这个盒子宽度设置为100vw,并且overflow:hidden。而列表项要包括内容和删除按钮,内容宽度为屏幕宽度,而删除按钮定位到右边,所以整个列表项宽度是超过100vw的。描述可能没有那么清晰,直接上代码:

<View className='swipe-item'>
  <View className='swipe-item-wrap' style={moveStyle}>
   <View
    className='swipe-item-left'
    onTouchStart={this.handleTouchStart}
    onTouchMove={this.handleTouchMove.bind(this, index)}
    onTouchEnd={this.handleTouchEnd}
   >
    <View>{item.title}</View>
   </View>
   <View className='swipe-item-right'>
    <View className='swipe-item-del'>del</View>
   </View>
  </View>
</View>

.swipe-item {
 width: 100vw;
 overflow: hidden;
 line-height: 24PX;
 height: 24PX;
 text-align: center;
 margin-bottom: 10PX;

 &-wrap {
  width: calc(100vw + 32PX);
  height: 100%;
  position: relative;
 }

 &-left {
  width: 100vw;
 }

 &-right {
  width: 32PX;
  height: 100%;
  background: pink;
  position: absolute;
  right: 0;
  top: 0;
 }
}

好了,布局结束之后,接下来是第二个问题:

2)判断是左滑还是右滑,左滑时出现删除,右滑时回归原位

可以看到上面的代码,我已经在列表项左边部分加了touch的一系列事件,下面就来分析下这几个事件

  • touchstart:开始时,要获取当前位置
  • touchmove:滑动时,获取滑动时的位置,同时纵向滑动时阻止。来判断当前是左滑还是右滑,左滑时e.touches[0].pageX在减小,而右滑时变大。为了防止一个手误操作,我加了一个判断,当滑动超过一定距离时才动。并且记录下当前滑动的是第几项。在render的时候给列表项加一个样式就可以实现了,就是第一段代码中的style。
  • touchend:滑动结束

上代码了~

handleTouchStart = e => { 
  this.startX = e.touches[0].pageX
  this.startY = e.touches[0].pageY
 }

 handleTouchMove (index, e) {
  // 若想阻止冒泡且最外层盒子为scrollView,不可用e.stopPropogagation(),否则页面卡死
  this.currentX = e.touches[0].pageX
  this.moveX = this.currentX - this.startX
  this.moveY = e.touches[0].pageY - this.startY
  // 纵向移动时return
  if (Math.abs(this.moveY) > Math.abs(this.moveX)) {
   return
  }
  // 滑动超过一定距离时,才触发
  if (Math.abs(this.moveX) < 10 ) {
   return
  }
  else {
   // 否则没有动画效果
   this.setState({
    hasTransition: true
   })
  }
  // 通知父组件当前滑动的为第几项
  this.props.onSetCurIndex(index)
 }

 handleTouchEnd = e => {
  // 结束时,置为true,否则render时不生效
  this.setState({
   hasTransition: true
  })
 }

3)排他性

这个主要是通过触发父组件的一个事件,在父组件中设置一个当前滑动项的index值,然后再通过props值传入子组件,渲染的时候加一个判断实现。

// 左滑时,出现del,右滑时,恢复原位,距离为操作按钮大小
// 也可以将滑动距离作为移动距离,但是效果不太好
const distance = this.moveX >= 0 ? 0 : -32
let moveStyle = {}
// 排他性,若某一个处于滑动状态时,其他都回归原位
if (hasTransition && currentIndex === index) {
 moveStyle.transform = `translateX(${distance}PX)`
 moveStyle.webkitTransform = `translateX(${distance}PX)`
 moveStyle.transition = 'transform 0.3s ease'
 moveStyle.WebkitTransition = 'transform 0.3s ease'
}

列表项就到此结束了,下面来说列表组件中调用列表项~

handleCurIndex = index => {
  // 设置当前滑动项,做排他性
  this.setState({
   currentIndex: index
  })
}

<SwipeItem
 item={item}
 key={item.id}
 index={index}
 currentIndex={currentIndex}
 onSetCurIndex={this.handleCurIndex}
/>

好了,大致就是这些了,可能有点混乱,大家可以移步demo源码~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js批量设置样式的三种方法不推荐使用with
Feb 25 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
May 22 Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 Javascript
JQuery.get提交页面不跳转的解决方法
Jan 13 Javascript
js如何实现点击标签文字,文字在文本框出现
Aug 05 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
基于js中this和event 的区别(详解)
Oct 24 Javascript
JS函数内部属性之arguments和this实例解析
Oct 07 Javascript
详细分析vue响应式原理
Jun 22 Javascript
Vue3不支持Filters过滤器的问题
Sep 24 Javascript
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
JS setTimeout与setInterval的区别
Apr 20 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 #jQuery
小程序中canvas的drawImage方法参数使用详解
Jul 04 #Javascript
vue如何限制只能输入正负数及小数
Jul 04 #Javascript
Vue项目中ESlint规范示例代码
Jul 04 #Javascript
你或许不知道的一些npm实用技巧
Jul 04 #Javascript
中高级前端必须了解的JS中的内存管理(推荐)
Jul 04 #Javascript
angular6开发steps步骤条组件
Jul 04 #Javascript
You might like
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
深入认识javascript中的eval函数
2009/11/02 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
python使用socket远程连接错误处理方法
2015/04/29 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
深入了解python列表(LIST)
2020/06/08 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python判断变量是否为列表的方法
2020/09/17 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
总经理办公室主任岗位职责
2013/11/12 职场文书
合作意向协议书范本
2014/03/31 职场文书
双方协议书
2014/04/22 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
电影地道战观后感
2015/06/04 职场文书
2019广播稿怎么写
2019/04/17 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
Spring 使用注解开发
2022/05/20 Java/Android