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 相关文章推荐
JavaScript对象模型-执行模型
Apr 28 Javascript
JQuery 浮动导航栏实现代码
Aug 27 Javascript
jquery offset函数应用实例
Nov 14 Javascript
js实现按Ctrl+Enter发送效果
Sep 18 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
May 12 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 Javascript
JS自定义对象创建与简单使用方法示例
Jan 15 Javascript
用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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python json模块使用实例
2015/04/11 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
解决Python使用列表副本的问题
2019/12/19 Python
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
家长给小学生的评语
2014/01/30 职场文书
保护环境建议书400字
2014/05/13 职场文书
开展读书活动总结
2014/06/30 职场文书
项目经理岗位职责
2015/01/31 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL