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

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

wxss

javascript 复制代码
/* 设置movable-area的宽度 */
.area{
  width: 100%;
}

/* a b c 每条元素的样式 */
movable-view {
  width: 100%;
  background-color: red;
  height: 40px;
  line-height: 40px;
  color: #FFFFFF;
  text-align: center;
}

都是些基本样式 也没什么好讲的 但是 这里我js中用了很多px的计算代码 大家最好还是看清楚再改 不然 rpx和px对不上问题还是很大的

js代码

javascript 复制代码
Page({
  data: {
    //排序元素集合
    list: [
      { text: 'a', id: 0, top: 0 },
      { text: 'b', id: 1, top: 0 },
      { text: 'c', id: 2, top: 0 }
    ],
    //整个元素的高度
    totalHeight: 0,
    //控制协助movable-area 元素重新渲染
    reload: true
  },
  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() {
    let list = this.data.list
    if(!list.length) {
      return
    }
    list = list.map((item,index) => {
      item.top = (index*50)
      return item
    })
    this.setData({
      list: list,
      totalHeight: list.length*50,
      reload: true
    })
  },
  handleTouchEnd() {
    //先将reload 改为false 让movable-area wxif不生效 强制移除
    this.setData({
      reload: false
    })
    //等待想试试数据生效修改后 调用初始化函数
    wx.nextTick(() => {
      this.initialization();
    })
  },
  //当用户拖动某块元素时触发
  handleTouchMove: function (event) {
    //获取到当前用拖动的是第几个元素
    const index = event.currentTarget.dataset.index
    //获取到 y 轴  就是 上下拖动的距离
    const currentY = event.touches[0].clientY
    //定义一个list 接受tata中的list
    const list = this.data.list
    // 通过index 从list 集合中找到当前元素 对比 top和拖动的高度
    if(currentY > (list[index].top+70)) {
      // 如果比起之前  乡下了  70还要多 直接 调用 向后移动一个下标的函数
      const newArray = this.moveElementBackward(list, index);
      //调用setData 修改函数 修改 data中的 list 换成我们新处理好的函数
      this.setData({
        list: newArray
      })
      //等待  响应式数据修改并生效后再执行的nextTick
      wx.nextTick(() => {
        //调用初始化函数
        this.initialization();
      })
    }else if(currentY < (list[index].top-20)) {
      const newArray = this.moveIndexForward(list, index);
      this.setData({
        list: newArray
      })
      //等待  响应式数据修改并生效后再执行的nextTick
      wx.nextTick(() => {
        //调用初始化函数
        this.initialization();
      })
    }
  }
});

我的注释还是写的非常认真的 大家可以好好读一读

然后 wxml 没什么特别的 就是渲染一下list

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

这样 我们就做了一个 可以上下拖动元素排序的小案例了

效果也是非常不错的

相关推荐
2401_845937535 小时前
PHP一键约课高效健身智能健身管理系统小程序源码
微信·微信小程序·小程序·微信公众平台·微信开放平台
程序员入门进阶7 小时前
基于微信小程序的科创微应用平台设计与实现+ssm(lw+演示+源码+运行)
微信小程序·小程序
计算机源码社15 小时前
分享一个基于微信小程序的居家养老服务小程序 养老服务预约安卓app uniapp(源码、调试、LW、开题、PPT)
android·微信小程序·uni-app·毕业设计项目·毕业设计源码·计算机课程设计·计算机毕业设计开题
DreamByte16 小时前
Python Tkinter小程序
开发语言·python·小程序
说私域17 小时前
开源 AI 智能名片小程序:开启内容营销新境界
人工智能·小程序
汇匠源17 小时前
零工市场小程序:保障灵活就业
java·小程序·零工市场
哈尔滨财富通科技17 小时前
家居小程序有什么用?
小程序
双普拉斯18 小时前
微信小程序点赞动画特效实现
nginx·微信小程序·notepad++
程序员阿龙18 小时前
【2025】基于微信小程序的网上点餐系统设计与实现、基于微信小程序的智能网上点餐系统、微信小程序点餐系统设计、智能点餐系统开发、微信小程序网上点餐平台设计
微信小程序·小程序·毕业设计·订单管理·在线点餐·订单跟踪·在线支付
Angus-zoe18 小时前
uniapp+vue+微信小程序实现侧边导航
vue.js·微信小程序·uni-app