Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信小程序(二)学妹问我微信小程序左滑删除怎么实现

微信小程序(二)学妹问我微信小程序左滑删除怎么实现

作者头像
andyhu
发布于 2022-12-14 07:25:11
发布于 2022-12-14 07:25:11
5.7K09
代码可运行
举报
文章被收录于专栏:andyhu-大前端andyhu-大前端
运行总次数:9
代码可运行

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

背景

上篇文章记录了小程序的自定义导航栏的实现过程和小程序基础组件 cover-image 中 使用 fiexd 失效的坑。 前天突然在qq上看到一个学妹在群里@我问我小程序怎么实现左滑删除,今天正好周末有空,于是就在掘金上写了这篇文章。

效果展示

实现过程

  • 用小程序基础组件 movable-areamovable-view 搭建视图架子
  • 拿到后台的商品数据循环展示
  • 左滑展示右侧隐藏的红色删除按钮
  • 点击按钮,通过 dataset 拿到当前索引,删除数组中对应的数据

伪代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<block wx:for="{{infoList}}" wx:for-index="index" wx:key="id" wx:for-item="item">
  <movable-area >
    <movable-view class="item" damping="100" direction="horizontal" out-of-bounds="true" animation="true">
      <!-- 滑动删除左边显示信息的盒子 -->
      <view></view>
      <!-- 右边删除按钮的盒子 -->
      <view bindtap="handleDelShop">删除</view>
    </movable-view>
  </movable-area>
</block>
    
  // js 代码  
  // 删除商品处理事件
async handleDelShop(e) {
    let { index, id } = e.currentTarget.dataset;
    let infoList = this.data.cartData.goods;
    infoList.splice(index, 1);
    this.setData({
      [infoList]: infoList,
    })
},

需要注意的地方

  • 左边显示的区域宽度一定要设置 100vw,并且加上 overflow: hidden 防止出现x轴方向的滑动条,在外层的整个盒子加上 box-sizing: border-box;
  • 给基础组件设置高度 movable-areamovable-view 是有默认的高度的,必须设置这两个基础组件的高度,如果不设置的话,就算里面的盒子有固定高度,也不会生效的,所以特别一定要注意,设置固定高度,在写代码前就要算好里面的盒子的高度,如果因为数据不确定,根据不同数据展示不同高度的话,可以用条件判断,设置不同高度。

优化

为了用户体验更好,我做了一下优化,类似这种效果:

(因为在网吧写的文章,没有动图素材,就用了别人的动态图,忘记来源了,不过放心哈,代码实现的效果是一样的!有知道动态来源的可以告诉我,后面我加上。)

做了以下优化:

  • 判断上下滑动还是左右滑动,上下滑动则复原所有项的样子(隐藏所有项的删除按钮)。
  • 左滑另一个项时,其他项的删除按钮全隐藏,只显示一个项的删除。
  • 左滑距离超过 20px 就自动滑到能显示完整的删除按钮的样子。小于 20px 则恢复原来的样子(隐藏删除按钮)

ok,废话不多说了看具体代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<block wx:for="{{infoList}}" wx:for-index="index" wx:key="id" wx:for-item="item">
  <movable-area >
    <movable-view bindtouchstart="touchStart" data-index="{{index}}" bindtouchend="touchend" class="item" x="{{shopInfo.x}}" y="{{shopInfo.y}}" damping="100" direction="horizontal" out-of-bounds="true" animation="true">
      <!-- 滑动删除左边显示信息的盒子 -->
      <view></view>
      <!-- 右边删除按钮的盒子 -->
      <view bindtap="handleDelShop">删除</view>
    </movable-view>
  </movable-area>
</block>
    
  // js 代码 data 里的变量:
data: {
    currentTouche: {
      x: 0,
      y: 0
    },
    offset: 20,
},
  
  // 删除商品处理事件
async handleDelShop(e) {
    let { index, id } = e.currentTarget.dataset;
    let infoList = this.data.cartData.goods;
    infoList.splice(index, 1);
    this.setData({
      [infoList]: infoList,
    })
},
  touchStart(e) {
    let { clientX, clientY } = e.changedTouches[0];
    let { index } = e.currentTarget.dataset;

    // 重置列表除当前操作的项之外的所有项在x方向的偏移量
    let newCartData = this.data.infoList.map((v, idx) => {
      if (index != idx) {
        v.x = '';
        v.y = '';
      }
      return v;
    })
    this.setData({
      infoList: newCartData
    })

    this.setData({
      currentTouche: {
        x: clientX,
        y: clientY
      }
    })
  },
  touchend(e) {
    let { clientX, clientY } = e.changedTouches[0];
    let { index } = e.currentTarget.dataset;
    // 判断是上下滑还是左右滑
    if (Math.abs(clientY - this.data.currentTouche.y) < Math.abs(clientX - this.data.currentTouche.x)) {  // 左右滑动
      // 判断是左滑还是右滑
      if (clientX >= this.data.currentTouche.x) {  // 右滑
        this.setData({
          [`infoList[${index}].x`]: 0
        })
      } else {   //左滑
        if (this.data.currentTouche.x - clientX >= this.data.offset) {
          this.setData({
            [`infoList[${index}].x`]: -rpxTopx(164)
          })
        } else {
          this.setData({
            [`infoList[${index}].x`]: 0
          })
        }
      }
    } else {  // 上下滑动
      // 重置数据
      this.setData({
        [`infoList[${index}].x`]: 0
      })
    }
    this.setData({
      currentTouche: {
        x: clientX,
        y: clientY
      }
    })
  },

代码解释:通过 touchStart 和 touchEnd 事件可以知道滑动开始时的位置和滑动结束后的位置。

获取 changedTouches[0] 触摸点的位置信息

changedTouches 里一项的属性

  1. 先判断上下滑动的距离是否大于左右滑动的距离,如果大于则为上下滑动并且重置位置数据,否则为左右滑动,
  2. 如果为左右滑动时判断左滑还是右滑,左滑时:左滑距离超过 20px 就自动滑到能显示完整的删除按钮的样子。小于 20px 则恢复原来的样子(隐藏删除按钮)。如果右滑时重置 x 轴方向的位置数据(让删除按钮隐藏,恢复到原来的样子)。

总结

功能实现起来很简单,但是刚开始因为时间不叫紧迫,就做的不叫匆忙,后就有需要优化用户体验的地方,比如左滑移动的距离在 20px 以内松手后应该反弹回原来的位置,超过 20px 松手后应该自动滑动到百分之100。

因为小程序对用户来说比较方便,所以一般的toC的项目都会有小程序端。总之希望这边文章对小伙伴们有作用!感觉还不错的话可以点赞收藏起来,以备不时之需(说不定下次公司就让你写这种小程序类似的需求了呢😂)

写在最后

我是 AndyHu,目前暂时是一枚前端搬砖工程师。

文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注呀😊

未经许可禁止转载💌

speak less,do more.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序向左滑动删除操作(类仿微信、QQ)
上一个小程序的项目里面做过这个功能,当时没有记录下来,今天特意做了一个小的demo放在了github上面,下次在开发中遇到的话就可以直接拿下来代码复用了。效果很简单,类似于微信扣扣删除聊天栏的效果,想左滑动,出现删除按钮,点击即可删除。
王小婷
2018/12/24
3.6K1
微信小程序之列表左滑删除功能
介绍 第一次写小程序,记录一下遇到的需求以及解决方法。可能功能不是很难,主要是做下记录。为以后遇到相同的需求做铺垫。 什么是左滑删除 用过QQ的人都知道,消息列表内,左滑单个聊天可以删除、置顶的操作。对于移动端窄小的屏幕来说,这种交互可以说是非常的节省地方。故受到了众多产品狗的喜爱。 [image] 实现原理 最外层一个view水平方向排列,里面包含一个内容区view,一个操作区view 让你要展示的布局充满屏幕,通过css样式让超出的删除按钮隐藏 监听touch事件,平移布局显示和隐藏删除按钮(列表每一项
w候人兮猗
2020/06/24
1.1K0
小程序 — 实现左滑删除效果①
(1)movable-area这个就是定义了一个移动的区域,跟普通的<view></view>的含义是一样的,不同在于,接着往下看;
Ewall
2018/09/30
2.7K0
小程序 — 实现左滑删除效果①
uniapp实现小程序页面自由拖拽组件
这种方式最容易想到,通过js监听触摸位置动态修改元素坐标。但是拖拽是一个实时性要求非常高的操作,你不能说在这个操作里面去设置节流函数减少setData操作,并且本身每次setData操作也是比较耗性能的,很容易造成拖拽卡顿,这个方案可以首先排除。
用户6256742
2024/07/31
1.4K0
微信小程序开发-多条件搜索tab展示
小程序开发的过程中列表页面的搜索项太多,需要合理的利用交互方式来达到功能效果,先看下效果图
code2roc
2023/07/19
3990
微信小程序开发-多条件搜索tab展示
小程序 — 实现左滑删除效果②
(1)在上一章中,我们给movable-view绑定了一个bindchange事件,事件名为onChange,这个事件是干吗的呢?
Ewall
2018/09/30
1.2K0
小程序 — 实现左滑删除效果②
微信小程序官方组件展示之视图容器movable-area源码
以下将展示微信小程序之视图容器movable-area官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。
软件事业部
2022/08/16
5590
小程序todolist
  上节详细描述了小程序环境搭建,承诺了这节讲todolist,我猜大家都是学习过 vue 或者 react 之后才学习小程序的,对于todolist 的逻辑问题我暂不做详细描述,如果遇到些许问题,请及时留言或评论在下方,本人常在。
我不是费圆
2020/12/17
9130
微信小程序新增拖动组件:movable-view
小程序在520节日前夜,让程序员们又躁动了一把,更新了一些很诱人的功能,如内容转发API,iBeacon API,振动API,屏幕亮度调节API等,也增强了地图组件的功能。
一斤代码
2018/08/21
1.5K0
微信小程序新增拖动组件:movable-view
手把手带你学习微信小程序 —— 九 (movable-view 组件)
movable-view,从字面意思上就可以理解,可以移动的组件,具体是什么样的呢,看下面的效果图
Gorit
2021/12/08
2.1K0
手把手带你学习微信小程序 —— 九 (movable-view 组件)
微信小程序内拖动图片实现移动、放大、旋转
最近接到一个任务,在微信小程序内拖动图片组件实现移动、放大、旋转,并记录这些图片的移动位置,放大比例,旋转角度,在一个画布上生成一张图片,最后保存到手机相册。
超级小可爱
2023/02/20
2.1K0
【愚公系列】2022年03月 微信小程序-视图容器
覆盖在原生组件之上的图片视图。可覆盖的原生组件同cover-view,支持嵌套在cover-view里。
愚公搬代码
2022/12/01
6500
【愚公系列】2022年03月 微信小程序-视图容器
微信小程序自定义组件-城市选择「建议收藏」
上篇文章有介绍一些小程序的自定义组件语法,这篇文章就不多做赘述,重点介绍组件的实现逻辑。
全栈程序员站长
2022/08/04
1.9K0
微信小程序 -- 基于 movable-view 实现拖拽排序
微信小程序 -- 基于 movable-view 实现拖拽排序 项目基于colorui样式组件 ColorUI组件库 (color-ui.com) 1.实现效果 2. 设计思路 movable-
Kindear
2021/06/21
2.7K0
微信小程序 -- 基于 movable-view 实现拖拽排序
小程序基于DOM的小镇游戏开发
需要开发一个小镇游戏,包含建造建筑、升级建筑、建筑生产金币、收金币等功能。整体复杂度不是太高,主要是建筑的循环动画和地图上小车、风车等小元素的动画,所以考虑使用DOM+CSS3动画来实现。
790531192
2022/02/07
9960
小程序基于DOM的小镇游戏开发
微信小程序实战开发教程-抽屉菜单
抽屉菜单是app上常见的菜单设计方式,典型的抽屉菜单如下图所示 下面展示如何基于微信小程序实现抽屉菜单,最终效果如下图所示: 页面包含一个主页和抽屉菜单页,为了实现滑动效果,页面采用absolute
极乐君
2018/02/05
2.8K0
微信小程序实战开发教程-抽屉菜单
微信小程序实现各种特效实例
写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下
okaychen
2018/01/05
4.1K3
微信小程序实现各种特效实例
小程序监听屏幕滑动事件
2.根据触点的起始位置和终止位置计算滑动方向(在data中配置touchx和touchy数值)
Kindear
2020/10/26
3.7K0
小程序搜索弹出搜索内容功能(模糊查询)
功能:在搜索界面,搜索输入的字符,如果有匹配,就会显示出来。 wxml <view class="page"> <view class="page__bd"> <view class="w
王小婷
2019/02/21
6.5K0
小程序搜索弹出搜索内容功能(模糊查询)
【愚公系列】2022年08月 微信小程序-左划删除效果实现
左划删除效果实现主要用到两个标签:movable-area、movable-view。
愚公搬代码
2022/09/26
3580
推荐阅读
相关推荐
微信小程序向左滑动删除操作(类仿微信、QQ)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验