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 相关文章推荐
麻雀虽小五脏俱全 Dojo自定义控件应用
Sep 04 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
Apr 11 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
jQuery实现防止提交按钮被双击的方法
Mar 24 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 Javascript
vue.js 表格分页ajax 异步加载数据
Oct 18 Javascript
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
微信小程序数据分析之自定义分析的实现
Aug 17 Javascript
详解基于Wepy开发小程序插件(推荐)
Aug 01 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 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生成随机密码的几种方法
2011/01/17 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
php集成动态口令认证
2016/07/21 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
小程序实现列表删除功能
2018/10/30 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python字符串循环左移
2019/03/08 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
wxPython实现文本框基础组件
2019/11/18 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
毕业典礼主持词大全
2014/03/26 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
领导参观欢迎词
2015/01/26 职场文书
2019入党申请书格式
2019/06/25 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server