unnapp 小程序长按拖动排序

在uniapp中实现长按拖动排序功能,可以使用<movable-area><movable-view>组件。以下是一个简单的示例:




<template>
  <view class="container">
    <movable-area class="drag-area" :style="{ height: list.length * 100 + 'rpx' }">
      <movable-view
        v-for="(item, index) in list"
        :key="item.id"
        class="drag-item"
        :y="index * 100"
        direction="vertical"
        @touchstart="touchStart"
        @touchmove="touchMove"
        @touchend="touchEnd"
      >
        {{ item.name }}
      </movable-view>
    </movable-area>
  </view>
</template>
 
<script>
export default {
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' },
        // ...
      ],
      startPos: 0,
      endPos: 0,
      isMoving: false,
    };
  },
  methods: {
    touchStart(e) {
      this.startPos = e.touches[0].pageY;
      this.isMoving = true;
    },
    touchMove(e) {
      if (this.isMoving) {
        this.endPos = e.touches[0].pageY;
        const delta = this.endPos - this.startPos;
        const from = Math.floor(delta / 100);
        if (from !== 0 && this.canMove(from)) {
          const dragged = this.list.splice(e.currentTarget.dataset.index, 1)[0];
          this.list.splice(e.currentTarget.dataset.index + from, 0, dragged);
        }
        this.startPos = this.endPos;
      }
    },
    touchEnd() {
      this.isMoving = false;
    },
    canMove(from) {
      const src = this.list.findIndex(item => item.id === this.currentId);
      const dest = src + from;
      return dest >= 0 && dest < this.list.length;
    },
  },
};
</script>
 
<style>
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
}
 
.drag-area {
  width: 100%;
}
 
.drag-item {
  width: 100%;
  height: 100rpx;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: #fff;
  border-bottom: 1px solid #ccc;
}
</style>

在这个示例中,<movable-area>定义了一个拖动区域,<movable-view>是可拖动的列表项。通过监听触摸事件,我们可以计算用户的拖动距离,并在touchMove事件中移动列表项的位置。

注意:

  1. 这个例子使用了pageY来计算位置差,因此假设所有的<movable-view>都有相同的高度。
  2. 这个例子没有处理边界情况,比如当拖动到列表末尾时继续拖动。
最后修改于:2024年08月13日 13:21

评论已关闭

推荐阅读

Vue中使用mind-map实现在线思维导图
2024年08月04日
VUE
Web前端最全Vue实现免密登录跳转的方式_vue怎么样不登录返回首页,最强技术实现
2024年08月04日
VUE
vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)
2024年08月04日
VUE
Vue-颜色选择器实现方案——>Vue-Color( 实战*1+ Demo*7)
2024年08月04日
VUE
Vue项目卡顿慢加载?这些优化技巧告诉你!_vue数据多渲染卡顿
2024年08月04日
VUE
vue中的keep-alive详解与应用场景
2024年08月04日
VUE
Vue、React实现excel导出功能(三种实现方式保姆级讲解)
2024年08月04日
vue-office/docx插件实现docx文件预览
2024年08月04日
VUE
java调用js文件的两种方法(支持V8引擎)
2024年08月04日
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
2024年08月04日
两周从爬虫小白变大神 _yjs_js_security_passport
2024年08月04日
JS笔记(对象、函数、数组)
2024年08月04日
Markdown.js:强大的纯JavaScript Markdown解析器
2024年08月04日
Vue项目:js模拟点击a标签下载文件并重命名,URL文件地址下载方法、请求接口下载文件方法总结。
2024年08月04日
vue 父组件怎么获取子组件里面的data数据
2024年08月04日
VUE
个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)
2024年08月04日
el-table 表格封装并改造实现单元格可编辑
2024年08月04日
none
nodejs环境下创建vue项目、SSH密钥登陆!!!
2024年08月04日
vue+quill+element-ui实现视频、图片上传及缩放保姆级教程,轻松使用富文本
2024年08月04日
【three.js】22. Imported Models导入模型
2024年08月04日