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 插件开发方法小结
Oct 23 Javascript
JavaScript Distilled 基础知识与函数
Apr 07 Javascript
JS格式化数字金额用逗号隔开保留两位小数
Oct 18 Javascript
使用documentElement正确取得当前可见区域的大小
Jul 25 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
JS根据生日月份和日期计算星座的简单实现方法
Nov 24 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 Javascript
vue使用xe-utils函数库的具体方法
Mar 06 Javascript
解决await在forEach中不起作用的问题
Feb 25 Javascript
如何理解Vue前后端数据交互与显示
May 10 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程序之die调试法 快速解决错误
2009/09/17 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
nginx下安装php7+php5
2016/07/31 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
Django中Forms的使用代码解析
2018/02/10 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
学习心得体会
2014/01/01 职场文书
装配出错检讨书
2014/09/23 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python