微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件

这篇具有很好参考价值的文章主要介绍了微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为只是做个小案例 我就直接代码写page页面里了 其实很简单 组件稍微改一下就好了
wxss

/* 设置movable-area的宽度 */
.area{
  width: 100%;
}

/* a b c 每条元素的样式 */
movable-view {
  width: calc(100% - 2px);
  background-color: red;
  height: 60rpx;
  line-height: 60rpx;
  color: #FFFFFF;
  text-align: center;
  border: royalblue 1px solid;
}

就是很普通的样式编写

js代码

Page({
  data: {
    //排序的集合数据源
    list: [
      { text: 'a', id: 0 },
      { text: 'b', id: 1 },
      { text: 'c', id: 2 }
    ],
    nodeHeight: 0,  //记录单个节点的高度 px像素单位
    //设置movable-area总高度
    totalHeight: 0
  },
  //第一个要执行的生命周期
  onLoad: function () {
    //调用初始化函数
    this.initialization();
  },
  //将指定元素 在数组中后移一个下标
  moveElementBackward(arr, index) {
    if((index + 1) === arr.length) {
        return arr
    }
    const element = arr[index];
    arr.splice(index, 1);
    arr.splice(index + 1, 0, element);
    return arr;
  },
  //将指定元素 在数组中前移一个下标
  moveIndexForward(arr, index) {
    if(index == 0){
      return arr
    }
    var newArr = Array.from(arr);
    var value1 = newArr[index];
    var value2 = newArr[index - 1];
    newArr[index] = value2;
    newArr[index - 1] = value1;
    return newArr;
  },
  //初始化加载数据
  initialization() {
    //先确认 list是有数据的 如果没有直接 return结束逻辑
    let list = this.data.list
    if(!list.length) {
      return
    }
    const query = wx.createSelectorQuery()
    //获取 node 第一个节点的高度 不然不知道每个节点到底多高
    query.select('.node').boundingClientRect()
    query.exec((doms) => {
      /*
          循环遍历list top是与顶部的距离
          就是  当前下标乘以 当个高度
          例如 一个 40  那么 第二个的位置搞好是 40  而第三个则要在 80 第一个在 0
      */
      list = list.map((item,index) => {
        item.top = (index*doms[0].height)
        return item
      })
      //给总高度 单个节点高度  和  movable-area的高度赋值
      this.setData({
        nodeHeight: doms[0].height,
        totalHeight: (doms[0].height * list.length),
        list: list
      })
    })
  },
  //当用户拖拽完松开手时触发
  handleTouchEnd() {
    //调用initialization 初始化数据
    this.initialization()
  },
  //当用户拖动某块元素时触发
  handleTouchMove: function (event) {
    //获取到当前用拖动的是第几个元素
    const index = event.currentTarget.dataset.index
    //定义一个list 接受tata中的list
    const list = this.data.list
    // 计算出 当前下标应该在的位置  加上  多 三分之二个节点的高度
    const top = ((index * this.data.nodeHeight) + (this.data.nodeHeight * (2/3)))
    // 计算出当前元素应该在的位置  并减去 三分之二个节点的高度
    const bottom = ((index * this.data.nodeHeight) - (this.data.nodeHeight * (2/3)))

    //获取movable-area和movable-view节点
    const query = wx.createSelectorQuery().in(this)
    query.select('.area').boundingClientRect()
    query.selectAll('.node').boundingClientRect()
    query.exec(res => {
      //存储movable-area 元素信息
      const nodeRect = res[0]
      //获取用户当前拖动的元素信息
      const nodeTop = res[1][index]
      //用 node 与屏幕顶部的距离减去 area与屏幕顶部的距离 间距得到  node与area的距离
      const distance = (nodeTop.top - nodeRect.top)
      //用移动距离判断 是否下移了 2/3个节点还要多的距离
      if(distance > top) {
        // 调用 向后移动一个下标的函数
        const newArray = this.moveElementBackward(list, index);
        //调用setData 修改函数 修改 data中的 list 换成我们新处理好的函数
        this.setData({
          list: newArray
        })
        //等待  响应式数据修改并生效后再执行的nextTick
        wx.nextTick(() => {
          //调用初始化函数
          this.initialization();
        })
      }
      //用移动距离判断 是否上移了 2/3个节点还要多的距离
      if(distance < bottom) {
        //调用函数  将 当前下标上一一下  向上调1
        const newArray = this.moveIndexForward(list, index);
        this.setData({
          list: newArray
        })
        //等待  响应式数据修改并生效后再执行的nextTick
        wx.nextTick(() => {
          //调用初始化函数
          this.initialization();
        })
      }
    })
  }
});

我的注释还是写的非常认真的 大家可以好好读一读
然后 wxml 没什么特别的 就是渲染一下list

<movable-area
  class = "area"
  style = "height: {{totalHeight}}px;"
>
  <movable-view
    wx:for="{{list}}"
    wx:key="id"
    data-index="{{index}}"
    y="{{item.top}}"
    direction="all"
    class="node"
    bindtouchmove="handleTouchMove"
    bindtouchend="handleTouchEnd"
  >
    {{item.text}}
  </movable-view>
</movable-area>

微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件,微信小程序,小程序
这样 我们就做了一个 可以上下拖动元素排序的小案例了
微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件,微信小程序,小程序
效果也是非常不错的文章来源地址https://www.toymoban.com/news/detail-725391.html

到了这里,关于微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于movable-view的微信小程序拖拽排序(含源码)

    目录 一、前言与效果展示 二、源码 1.目录结构 2.drag.wxml文件 3.drag.wxss文件 (1)drag.less (2)drag.wxss  不会使用less的就用这个 4.drag.js文件 5.drag.json文件 三、结语         最近在做一个账本,里面有个功能需要“拖拽排序”,网上的代码我也看不太懂,打算自己写一个。微信

    2024年02月03日
    浏览(40)
  • 微信小程序 movable-view 控制长按才触发拖动 轻轻滑动页面正常滚动效果

    今天写 movable-area+movable-view遇到了个头疼的问题 那就是 movable-view 监听了用户拖拽自己 但 我们小程序 上下滚动页面靠的也是拖拽 也就是说 如果放在这里 用户拖动 movable-view部分 就会永远触发不了滚动 那么 我们先可以 加一个 bindlongpress=\\\"longpressHandler\\\"事件 用户长按时触发 然

    2024年02月06日
    浏览(40)
  • 微信小程序通过wx.navigateBack实现返回上一个页面并调用方法

    需求 从A页面跳到B页面,B页面执行完所有步骤后返回A页面并调用A页面的方法 实现方法 主要用到 wx.navigateBack 和 wx.navigateTo 两个路由跳转方法,从A跳向B需要使用 wx.navigateTo ( 千万不能使用wx.redirectTo,这个跳转后页面就会销毁,无法通过wx.navigateBack返回 ) 参考文档 小程序官方对路

    2024年02月15日
    浏览(47)
  • 【微信小程序】通过调用 wx.navigateBack() 方法来退出当前界面并返回上一个界面

    在点击某个按钮或执行某个条件时触发,示例代码: 在这个示例中, delta 参数指定了要返回的界面数。如果你只想返回上一个界面,可以将 delta 设置为 1。如果你想返回更多的界面,可以增加 delta 的值。 在小程序中,tabBar 页面的返回操作与非 tabBar 页面有所不同。通常,

    2024年02月13日
    浏览(52)
  • 微信小程序 通过setData 给两个变量设置同一个数组时,为什么修改一个变量,另一个会也被修改?

    在微信小程序中,使用 setData 方法更新数据时,如果给两个变量设置同一个数组,修改其中一个变量的值会导致另一个变量也被修改的原因是,数组是引用类型的数据,在内存中的存储方式是按引用地址存储。 当你将一个数组赋值给两个变量时,实际上两个变量共享同一块内

    2024年02月11日
    浏览(45)
  • 微信小程序缩放图片与滑动图片:movable-view与swiper一起使用所产生的手势冲突的基本解决方案(操作过于频繁还是会出现问题,基本的使用是没有问题的)

    1.一些参数和需要用到的方法js代码注释都有了,只要复制过去看就好了 2.怎么解决这个手势冲突呢,我采用的是mina-touch插件,去监听这两种手势,当双指在的时候,长按事件就不触发,滑动的时候长按事件也要阻止,因为在不停的滑动的时候,也会长按,大概就是这么一个

    2024年02月15日
    浏览(50)
  • 通过微信小程序实现登录功能

    [ ](https://dev.csdn.net/activity?utm_source=sale_sourcesale_source=q4AnCOkys7) 在微信公众平台中注册小程序,并获取 AppID。 在小程序中创建登录页面,包括用户名、密码输入框和登录按钮。 将用户名和密码通过 HTTPS POST 请求发送到后端服务器。 后端服务器验证用户名和密码是否正确,如果

    2023年04月13日
    浏览(69)
  • 微信小程序通过字典表匹配对应数据

    一般来说,前端根据后台返回 code 码展示对应内容只需要在前台判断 code 值展示对应的内容即可,但要是匹配的 code 码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过 wxs 的方法实现这个操作。 可以看到,上述

    2024年02月03日
    浏览(43)
  • 微信小程序通过Webview打开外部网站

    微信小程序是支持访问第三方网站,但前提是第三方网站得允许访问,因此要在第三方网站的根目录下添加“业务域名” 登陆小程序后台,找到开发设置,添加要访问的第三方网站 先配置校验文件到第三方网站根目录下  再添加验证。 这个时候,就可以在小程序内通过web

    2024年02月11日
    浏览(38)
  • 微信小程序怎么制作?制作一个微信小程序需要多少钱?

    随着移动互联网的快速发展,微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性,为各类企业和个人提供了一个全新的展示和交易平台。那么,如何制作一个微信小程序?又需要投入多少资金呢?本文将为您提供全面的解答。 制作微信小程序的步骤 1 、准

    2024年04月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包