vue实现列表拖拽排序的功能


Posted in Javascript onNovember 02, 2020

在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果;这里提供一种简单的实现方案。

此例子基于vuecli3

首先,我们先了解一下js原生拖动事件:

在拖动目标上触发事件 (源元素):

  • ondragstart - 用户开始拖动元素时触发
  • ondrag - 元素正在拖动时触发
  • ondragend - 用户完成元素拖动后触发

释放目标时触发的事件:

  • ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
  • ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
  • ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
  • ondrop - 在一个拖动过程中,释放鼠标键时触发此事件

 基于js的原生拖拽事件,本次实现的拖拽排序的原理大概是:鼠标按住列表某一项开始拖动时触发ondragstart事件,将该拖动项用变量记录下来;

接着拖拽过程中,该拖动项经过列表其他项时,触发ondragenter事件,同样记录该拖动项最后经过的列表其他项的数据,最后在ondragend 事件中

将数组列表删掉一开始ondragstart事件记录的拖动项,并将删掉的数据插入ondragenter事件最后记录的位置,完成拖动排序。

 具体代码如下:

<template>
  <div class="test_wrapper" @dragover="dragover($event)">
    <transition-group class="transition-wrapper" name="sort">
      <div v-for="(item) in dataList" :key='item.id' class="sort-item"
        :draggable="true"
        @dragstart="dragstart(item)"
        @dragenter="dragenter(item,$event)"
        @dragend="dragend(item,$event)"
        @dragover="dragover($event)"
      >
        {{ item.label }}
      </div>
    </transition-group>
  </div>
</template>

<script lang="ts">
  import {Vue, Component, Prop, Watch} from "vue-property-decorator";
  import { addWebsite } from '@/api'
  @Component({
    components: {}
  })
  export default class Test extends Vue {

    oldData: any = null; // 开始排序时按住的旧数据
    newData: any = null; // 拖拽过程的数据

    // 列表数据
    dataList:any = [
      { id:1,label:'测试一号' },
      { id:2,label:'测试二号' },
      { id:3,label:'测试三号' },
      { id:4,label:'测试四号' },
    ];

    dragstart(value: any) {
      this.oldData = value
    }

    // 记录移动过程中信息
    dragenter(value: any, e: any) {
      this.newData = value
      e.preventDefault()
    }

    // 拖拽最终操作
    dragend(value: any, e: any) {
      if (this.oldData !== this.newData) {
        let oldIndex = this.dataList.indexOf(this.oldData)
        let newIndex = this.dataList.indexOf(this.newData)
        let newItems = [...this.dataList]
        // 删除老的节点
        newItems.splice(oldIndex, 1)
        // 在列表中目标位置增加新的节点
        newItems.splice(newIndex, 0, this.oldData)
        this.dataList = [...newItems]
      }
    }


    // 拖动事件(主要是为了拖动时鼠标光标不变为禁止)
    dragover(e: any) {
      e.preventDefault()
    }


  };
</script>

另外

为了实现拖动的动画效果,这里用到了transition-group组件,如上面代码显示,将transition-group组件的属性name设为‘sort';并添加以下代码;

.sort-move {
      transition: transform 0.3s;
    }

       注意:为了让transition有效果出现,v-for渲染的数据列表必须有key属性,且该key属性不可设为index; 

最终效果如下:

vue实现列表拖拽排序的功能

以上就是vue实现列表拖拽排序的功能的详细内容,更多关于vue 拖拽排序的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jquery插件开发注意事项小结
Jun 04 Javascript
javascript删除一个html元素节点的方法
Dec 20 Javascript
Javascript中实现String.startsWith和endsWith方法
Jun 10 Javascript
JavaScript各类型的关系图解
Oct 16 Javascript
使用jQuery获取data-的自定义属性
Nov 10 Javascript
js+css实现select的美化效果
Mar 24 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
AngularJS基于MVC的复杂操作实例讲解
Dec 31 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
JS数组求和的常用方法实例小结
Jan 07 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
用vue写一个日历
Nov 02 #Javascript
在vue中使用vant TreeSelect分类选择组件操作
Nov 02 #Javascript
vant自定义二级菜单操作
Nov 02 #Javascript
JavaScript动态生成表格的示例
Nov 02 #Javascript
JavaScript实现图片放大预览效果
Nov 02 #Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
Nov 02 #Javascript
在antd4.0中Form使用initialValue操作
Nov 02 #Javascript
You might like
PHP 手机归属地查询 api
2010/02/08 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python restful框架接口开发实现
2020/04/13 Python
python中adb有什么功能
2020/06/07 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
高一物理教学反思
2014/01/24 职场文书
军训学生自我鉴定
2014/02/12 职场文书
2014年班主任工作总结
2014/11/08 职场文书
全民创业工作总结
2015/08/13 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang