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对象与打印对象分析比较
Apr 23 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
JavaScript中函数(Function)的apply与call理解
Jul 08 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
Aug 25 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
微信小程序模板(template)使用详解
Jan 31 Javascript
详解js的视频和音频采集
Aug 09 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
a标签调用js的方法总结
Sep 05 Javascript
解决Vue router-link绑定事件不生效的问题
Jul 22 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数组和explode函数示例总结
2015/05/08 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
python中wheel的用法整理
2020/06/15 Python
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
自我评价个人范文
2013/12/16 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
单位委托书
2014/10/15 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
地球上的星星观后感
2015/06/02 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
如何利用python创作字符画
2022/06/25 Python