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 相关文章推荐
在线编辑器的实现原理(兼容IE和FireFox)
Mar 09 Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
Jan 09 Javascript
JavaScript插件化开发教程 (一)
Jan 27 Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 Javascript
AngularJS 中的事件详解
Jul 28 Javascript
javascript设计模式之module(模块)模式
Aug 19 Javascript
JS实现微信摇一摇原理解析
Jul 22 Javascript
Javascript刷新页面的实例
Sep 23 Javascript
小程序如何获取多个formId实现详解
Sep 20 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
Mar 05 Javascript
vue单应用在ios系统中实现微信分享功能操作
Sep 07 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无序树实现方法
2015/07/28 PHP
详解php协程知识点
2018/09/21 PHP
javascript:void(0)使用探讨
2013/08/27 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python 自动重连wifi windows的方法
2018/12/18 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
土木建筑学生自我评价
2014/01/14 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
检讨书范文1000字
2015/01/28 职场文书
大学团日活动总结书
2015/05/11 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书