微信小程序-侧滑删除

简介      

        movable-view和movable-area是可移动的视图容器,在页面中可以拖拽滑动。

        本篇文章将会通过该容器实现一个常用的拖拽按钮功能。

使用效果

代码实现

side-view.wtml

布局见下面代码,left view为内容区域,right view为操作按钮,在使用时候只需要替换left和right 对应slot即可。

movable-area 宽度 为left宽度,movable-view宽度为left + right宽度

监听事件为鼠标点击和鼠标弹起事件。

<!--slide-view/slide-view.wxml-->
<movable-area class="container" style="width: {{width}}rpx;height: {{height}}rpx;">
  <movable-view direction="horizontal" class="movable-view" style="width: {{width + slideWidth}}rpx; height: {{height}}rpx;" inertia bind:touchend="onTouchEnd" 
  damping="100"
  out-of-bounds
  x = "{{x}}" 
  bind:touchstart="onTouchStart" >
    <view class="left" >
      <slot name= "left"></slot>
    </view>
    <view class= "right">
      <slot name="right"></slot>
    </view>
  </movable-view>
</movable-area>
side-view.js

       组件的state 为 x, x表示movable-view 水平位置,在鼠标弹起时候,若移动距离大于threshold,则设置x为-threshold,否则为0。

注意: 事件event 对应位置,大小单位为px,而我们设置的参数都是rpx,若对其计算时候,注意两者之间转换。


Component({
  /**
   * 组件的属性列表
   */
  options: {
    multipleSlots: true
  },
  properties: {
    //  组件显示区域的宽度,rpx
    width: {
      type: Number,
      value: 750
    },
    //  组件显示区域的高度,rpx
    height: {
      type: Number,
      value: 0
    },
    //  组件滑动显示区域的宽度,rpx
    slideWidth: {
      type: Number,
      value: 0
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
   
    x: 0
   
  },

  /**
   * 组件的方法列表
   */
  ready: function ready() {
    this.init();
  },
  ready: function () {
    this.initFunc()
  },

  methods: {
    initFunc: function(){
      // 获取右侧滑动显示区域的宽度
      var that = this;
      var query = wx.createSelectorQuery().in(this);
      query.select('.right').boundingClientRect(function (right) {    
        that._slideWidth = right.width * 2; // rpx
        that._threshold = right.width / 2; // px
        that.setData({
          width:750,
          height:100,
          slideWidth: that._slideWidth
        }) //触发渲染
      }).exec();
    },
    onTouchStart: function onTouchStart(e) {
      this._startX = e.changedTouches[0].pageX;
      console.log('startX:'+this._startX)
    },

    //  当滑动范围超过阈值自动完成剩余滑动
    onTouchEnd: function onTouchEnd(e) {
      this._endX = e.changedTouches[0].pageX; // px
      console.log('endX:'+this._endX)
      var _endX = this._endX,
          _startX = this._startX, 
          _threshold = this._threshold;
    
      if (_startX - _endX >= _threshold) {
        this.setData({
          x: -this._slideWidth
        });
      } else {
        this.setData({
          x: 0
        });
      } 
    },

    
  }
});

index.wtml

<!--index.wxml-->

<slide-view heigth = "100" width="750">
  <view class="left" slot = "left">
    这是一段文字
  </view>
  <view class="right" slot = "right" width = "300">
    <view class="read">已读</view>
    <view class="delete">删除</view>
  </view>
</slide-view>

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序-wepy-侧滑删除组件,支持自定义内容区在最近的微信小程序开发过程中需要用到侧滑删除的功能,微信小程序官方是没有提供这样的组件,再加上我们的微信小程序使用的是wepy组件开发框架开发的,wepy也没有提供这样的组件,之前也在github上搜索这方面的组件,没有发现合适的,当时只发现了一个开源的:https://github.com/GeoffZhu/wepy-swipe-delete 只不过该组件功能单一已经被作者废弃了,无奈自己动手撸了一个侧滑删除组件,现在把它开源出来吧。Requirementswepy: "^1.7.3"支持功能和特点自定义内容区域:支持之定义内容区域,组件内使用 slot占位。自定义滚动高度:可以自定义scroll-view的高度,默认为屏幕的高度。自定义menu :如果默认的menu样式不喜欢可以自定义,也可以显示或者隐藏指定的menu。左右滑动:支持左右滑动也可以设置只左右或者右滑。效果如下:       如何使用目前支持两种使用模式:1.page页面模式优点:可定制化高,扩展性强。 缺点:集成复杂,代码复用性差。2.component 组件模式优点:集成简单,代码复用性强,减少包的大小。 缺点:可定制到低。不建议使用page页面模式,下面详细介绍component 组件模式的使用如何使用// 导入组件import SwipeDeleteView from '@/components/wepy-swipe-delete-view'// 声明组件  components = {       swipeDelete: SwipeDeleteView     }       // 引用组件   <template>   <swipeDelete :list.sync="list">       <view class="item">{{item.userName}}</view>     </swipeDelete>   </template>配置如下:<swipeDelete   :list.sync="list"                :scrollHeight="scrollHeight"                @deleteTap.user="deleteTap"                @deleteLongTap.user="deleteLongTap"                @editTap.user="editTap"                @editLongTap.user="editLongTap"                @addTap.user="addTap"                @addLongTap.user="addLongTap"                @markTap.user="markTap"                @markLongTap.user="markLongTap">属性属性说明备注list要显示的列表的原始数据,最好是加上.sync这样可以异步传值必传scrollHeight设置scroll-view的高度,默认为屏幕高度选传deleteTap.user删除menu单击事件回调必要时传deleteLongTap.user删除menu长按事件回调必要时传editTap.user编辑menu单击事件回调必要时传editLongTap.user编辑menu长按事件回调必要时传addTap.user添加menu单击事件回调必要时传addLongTap.user添加menu长按事件回调必要时传markTap.user标记menu单击事件回调必要时传markLongTap.user标记menu长按事件回调必要时传每个点击事件或者长按事件都会返回两个参数methods = {       deleteTap(view, item) {         console.log(item)         view.deleteItem()       },       deleteLongTap(view, item) {         console.log(item)         wx.showModal({           title: '提示',           content: '确定要删除吗?',           success: function (res) {             if (res.confirm) {               view.deleteItem()             } else {               view.closeItem()             }           }         })       }    }view :view 是SwipeDeleteView对象的本身,可以通过view来做一些其他操作,如:删除当前的itemitem : item 就是当前操作的原始数据,可以通过item获取真正需要的数据当前SwipeDeleteView对外暴露的函数有:函数名称函数说明参数deleteItem删除当前操作的item(原始数据 view)都会被删除不需要参数closeItem关闭当前操作的item,原始数据不变不需要参数网络异步加载更新如果使用的网络异步加载完成以后,还需要更新下组件,不然会出现无法侧滑的情况。导致原因:原始数据更新以后组件内部无法监听到,这样就不能获取到左右menu的宽度,所以不能侧滑解决办法:this.$invoke('swipeDelete', 'update'); swipeDelete必须和 components = {swipeDelete: SwipeDeleteView} 同名。代码如下:// 模拟网络加载延迟2秒钟    let that = this      setTimeout(function () {        for (let i = 0; i < 20; i ) {          let msg = {}          msg.userName = ''   '用户'   (i   1)          msg.msgText = '您有新的消息'          msg.color = that.buildRandomColor()          msg.height = that.buildRandomHeight()          msg.headerImg = options.avatarUrl          that.list.push(msg)        }        wx.hideLoading()        // 更新组件        that.$invoke('swipeDelete', 'update')        that.$apply()      }, 2000)
微信小程序是一种基于微信平台的应用的开发模式,可以快速的开发出符合用户需求的小程序。在小程序的开发中,组件是一个非常重要的概念,通过组件可以实现复用性和模块化编程思想。 组件应用是小程序开发的基础。通过组件可以将某一模块化并封装起来,使得组件可以在不同的页面间得到复用,大大提升了开发效率并减少了代码冗余。微信小程序提供了丰富的自带组件,包括文本、图片、按钮、输入框等等,开发者也可以自己开发组件来满足自己的需求。实际开发中,通过组件可以快速搭建页面框架和业务逻辑。 Demo是一个演示小程序的示例程序。在小程序的实际开发过程中,一个好的Demo非常重要。通过Demo,开发人员可以更深入的了解小程序的开发流程、组件的应用和实际的业务开发等等。在Demo中,通常会包括小程序的一些基础操作,如页面跳转、数据绑定、组件的使用等。而在实际开发中,Demo还会包括一些复杂的业务场景,如支付、登录、数据列表展示等等。Demo不仅为开发者提供了学习和实践的机会,也方便了使用者了解该小程序的功能和特点。 总之,微信小程序组件的应用和Demo的开发都是小程序开发过程中非常重要的两个部分。良好的组件应用和精心设计的Demo,可以在极短的时间内实现小程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值