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

news2024/11/16 17:31:04

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


/* 设置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代码

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

<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>

在这里插入图片描述
这样 我们就做了一个 可以上下拖动元素排序的小案例了
在这里插入图片描述
效果也是非常不错的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言进阶第五课-----------字符函数和字符串函数

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

库存管理方法有哪些?

本文将为大家讲解&#xff1a;库存管理方法有哪些&#xff1f; 库存管理是企业运营中的核心环节&#xff0c;它涉及到货物的采购、存储、销售和配送。有效的库存管理可以确保企业有足够的货物满足客户的需求&#xff0c;同时避免库存积压和浪费。为了达到这个目标&#xff0c;…

免费开源的非标项目型制造BOM一键导入方案介绍

非标项目型制造&#xff0c;每一个订单都会引入很多新料号、新BoM、新工艺路线。实施ERP/MES系统&#xff0c;实现生产管理数字化&#xff0c;第一步就是要导入这些料号、BoM和工艺。项目型制造&#xff0c;大多数订单只生产一次。但在ERP/MES系统中&#xff0c;订单的料号、Bo…

软件测试之概念篇2(瀑布模型、螺旋模型、增量模型和迭代模型、敏捷模型,V模型、W模型)

目录 开发模型 &#xff08;1&#xff09;瀑布模型 &#xff08;2&#xff09;螺旋模型 &#xff08;3&#xff09;增量模型和迭代模型 &#xff08;4&#xff09;敏捷模型 &#xff08;5&#xff09;测试模型&#xff08;V模型、W模型&#xff09; V模型 W模型 开发模型…

计算机等级考试—信息安全三级真题十

目录 一、单选题 二、填空题 三、综合题 一、单选题

企业文件、图纸加密软件哪个好——推荐【天锐绿盾加密软件】

天锐绿盾加密软件是一款全面、高效、方便的企业文件和图纸加密软件。 PC访问地址&#xff1a; isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是这款软件的一些优点和推荐理由&#xff1a; 天锐绿盾加密软件集文件加密、行为监控、权限控制于一体…

身为底层码农,你见过最无理需求是啥?

案例一 20万的项目&#xff0c;已经花了六十万了&#xff0c;客户突然又新提要求做一套百度的搜索系统&#xff0c;我尿了&#xff0c;一顿冥思苦想&#xff0c;然后做了一个搜索页面&#xff0c;把几百张表的每个字段都like一遍在搜索页面输入的查询内容&#xff0c;一次搜索…

五分钟Win11安装安卓(Android)子系统

十分钟&#xff0c;完成win11安装安卓子系统 Step1、地区设置为美国 Wini 进入设置页面&#xff0c;选择时间和语言-语言和区域- 区域-美国 Step2 安装 Windows Subsystem for Android™ with Amazon Appstore 访问如下连接&#xff0c;install即可 安卓子系统 Step3 安…

Ubuntu虚拟机安装教程

镜像下载地址&#xff1a; https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso 选择自己要存放的位置&#xff0c;不要放C盘 双击 选择镜像文件 等待 安装完成 能出网即可

PyTorch CUDA GPU高占用测试

0x00 问题描述 安装完成PyTorch、CUDA后&#xff0c;验证PyTorch是否能够通过CUDA高占用GPU&#xff08;占用>95%&#xff09;&#xff0c;特地使用以下代码测试。 0x01 代码设计 这个代码会持续执行神经网络的训练任务&#xff0c;每次循环都进行前向传播、反向传播和参数…

数据库系统工程师------时间周期

时间周期 计算机各种周期 时钟周期 机器&#xff08;CPU&#xff09;周期 指令周期 总线周期 时钟周期&#xff1a;也称振荡周期&#xff0c;定义为时钟频率的倒数。是计算机中最基本、最小的时间单位。 机器&#xff08;CPU&#xff09;周期&#xff1a;也称CPU周期&…

unity 使用模拟器进行Profiler性能调试

这篇文章主要记录如何实现通过模拟器对打包的app游戏进行Profiler调试。主要记录一些比较重要的点。 准备工作 首先你要能够打包unity的安卓包&#xff0c;如果没有安装安卓组件&#xff0c;请先安装组件。 安装完成以后&#xff0c;会在unity的安装目录找到相应的SDK 这个…

encoding/json vs json-iterator

encoding/json vs json-iterator 100% Compatibility 默认情况下&#xff0c;jsoniter 不会像标准库那样对映射键进行排序。如果你想要 100% 的兼容性&#xff0c;就这样使用 m : map[string]interface{}{"3": 3,"1": 1,"2": 2, } json : json…

10.10作业

运算符重载 #include <iostream>using namespace std;class Per{friend bool operator<(const Per &l, const Per &r);friend const Per operator(const Per &L,const Per &R);friend Per &operator-(Per &l , const Per &r); private:i…

棱镜七彩参编!开源领域4项团体标准正式发布

近日&#xff0c;中电标2023年第27号团体标准公告正式发布&#xff0c;《T/CESA 1270.2-2023 信息技术 开源治理 第 2 部分&#xff1a;企业治理评估模型》、《T/CESA 1270.3-2023 信息技术 开源治理 第 3 部分&#xff1a;社区治理框架》、《T/CESA 1270.5-2023 信息技术 开源…

Unity 捕鱼游戏开发教程与源码

效果图展示 项目分析 主要功能点&#xff1a; 鱼的移动路线 这里使用简单移动的方式&#xff1a;随机位置然后随机鱼直线或者每帧更新鱼的角度实现走圆形。枪随着鼠标或点击位置移动 这个用坐标转换参考代码 private void Update(){Vector3 mousePos; // 鼠标位置// RectTra…

[羊城杯 2020]black cat - 文件隐写+RCE(hash_hmac绕过)

[羊城杯 2020]black cat 1 解题流程1.1 第一步1.2 第二步1.3 第三步 1 解题流程 1.1 第一步 打开网站有首歌&#xff0c;按F12也是提示听歌&#xff0c;ctf-wscan扫描就flag.php下载歌&#xff0c;用010打开&#xff0c;发现有一段内容if(empty($_POST[Black-Cat-Sheriff]) |…

信息系统项目管理师第四版学习笔记——项目管理概论

项目基本要素 项目管理就是将知识、技能、工具与技术应用于项目活动&#xff0c;以满足项目的要求。通过合理地应用并整合特定的项目管理过程&#xff0c;项目管理使组织能够有效并高效地开展项目。 时间、成本、范围和质量等项目管理测量指标&#xff0c;历来被视为确定项目…

【Android】点击短信链接唤起APP的方案实践

一.概述 在很多业务场景中&#xff0c;需要点击短信链接跳转到App的指定页面。在Android系统中&#xff0c;想要实现这个功能&#xff0c;可以通过DeepLink或AppLink实现。 二.方案 1.DeepLink DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式&#xff0c;不…

源码开发经验:构建直播带货系统的关键步骤

在数字时代&#xff0c;直播带货已成为一种引领电子商务发展的热门趋势。无论您是一家电商巨头还是一位创业者&#xff0c;构建自己的直播带货平台都可能是一个具有巨大潜力的业务机会。本文将深入探讨构建直播带货平台的关键步骤&#xff0c;带您走进这一蓬勃发展的领域。 第…