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 相关文章推荐
mapper--图片热点区域高亮组件官方站点
Dec 22 Javascript
jQuery图片轮播的具体实现
Sep 11 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
Jan 07 Javascript
让浏览器DOM元素最后加载的js方法
Jul 29 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
关于JS解构的5种有趣用法
Sep 05 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
Sep 25 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 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
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
Javascript实现的分页函数
2006/12/22 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
TensorFlow实现创建分类器
2018/02/06 Python
pandas中去除指定字符的实例
2018/05/18 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
python下载微信公众号相关文章
2019/02/26 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
如何利用python发送邮件
2020/09/26 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
工厂实习感言
2014/01/14 职场文书
百日安全生产活动总结
2014/07/05 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
业务员管理制度范本
2015/08/06 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript