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当鼠标悬停时放大图片的效果实例
Jul 03 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
Aug 12 Javascript
客户端js判断文件类型和文件大小即限制上传大小
Nov 20 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
基于jQuery实现音乐播放试听列表
Apr 14 Javascript
js严格模式总结(分享)
Aug 22 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
微信小程序实现换肤功能
Mar 14 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
JS监听滚动和id自动定位滚动
Dec 18 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
Apr 26 Javascript
让IDE识别webpack的别名alias的实现方法
May 06 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中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
理论讲解python多进程并发编程
2018/02/09 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
Python提取频域特征知识点浅析
2019/03/04 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
旷课检讨书大全
2014/01/21 职场文书
五年级语文教学反思
2014/01/30 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
2015年招聘工作总结
2014/12/12 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
涨价通知
2015/04/23 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android