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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
Sep 11 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
Apr 11 Javascript
jquery图片放大功能简单实现
Aug 01 Javascript
js Date概念详细介绍
Nov 22 Javascript
javascript实现表单提交后,提交按钮不可用的方法
Apr 18 Javascript
JavaScript判断按钮被点击的方法
Dec 13 Javascript
javascript事件模型介绍
May 31 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
js中call()和apply()改变指针问题的讲解
Jan 17 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
优化使用mysql存储session的php代码
2008/01/10 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
php图片裁剪函数
2018/10/31 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
js实现随机数小游戏
2019/06/28 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
python实现实时监控文件的方法
2016/08/26 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
Java语言的优势
2015/01/10 面试题
三年大学生活自我鉴定
2014/01/21 职场文书
早读课迟到检讨书
2014/09/25 职场文书
2014年政工师工作总结
2014/12/18 职场文书
小学校园广播稿
2015/08/18 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
详细介绍python类及类的用法
2021/05/31 Python
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技