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 Keycode对照表
Oct 24 Javascript
jquery 查找新建元素代码
Jul 06 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
Jan 04 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
js replace 与replaceall实例用法详解
Aug 03 Javascript
jquery ajax 局部无刷新更新数据的实现案例
Feb 08 Javascript
自己动手手写jQuery插件总结
Jan 20 Javascript
jQuery在线选座位插件seat-charts特效代码分享
Aug 27 Javascript
jQuery UI制作选项卡(tabs)
Dec 13 Javascript
jquery实现数字输入框
Feb 22 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
js实现时钟定时器
Mar 26 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
短波问题解答
2021/02/28 无线电
php 各种应用乱码问题的解决方法
2010/05/09 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
webpack优化的深入理解
2018/12/10 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python合并同类型excel表格的方法
2018/04/01 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python爬虫实现获取下一页代码
2020/03/13 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
思想品德自我评价
2014/02/04 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
看雷锋电影观后感
2015/06/10 职场文书
校园广播稿范文
2015/08/19 职场文书
Oracle使用别名的好处
2022/04/19 Oracle