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 相关文章推荐
本地对象Array的原型扩展实现代码
Dec 04 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
Jun 26 Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
Jun 19 Javascript
javascript记住用户名和登录密码(两种方式)
Aug 04 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
你所未知的3种Node.js代码优化方式
Feb 25 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
Sep 13 Javascript
vue+koa2搭建mock数据环境的详细教程
May 18 Javascript
原生js+canvas实现下雪效果
Aug 02 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/03/03 咖啡文化
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
JS 继承实例分析
2008/11/04 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
pandas的qcut()方法详解
2019/07/06 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
程序员机试试题汇总
2012/03/07 面试题
金融专业个人的自我评价
2013/10/18 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
标准自荐信范文
2014/01/29 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
贷款承诺书
2015/01/20 职场文书
煤矿安全保证书
2015/02/27 职场文书
评职称个人总结
2015/03/05 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
人与自然观后感
2015/06/16 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis