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 相关文章推荐
juqery 学习之四 筛选查找
Nov 30 Javascript
js精度溢出解决方案
Dec 02 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
Jan 09 Javascript
基于javascript实现checkbox复选框实例代码
Jan 28 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
浅谈Angular2 模块懒加载的方法
Oct 04 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
Vue中的Vux配置指南
Dec 08 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
Mar 31 Javascript
Vue实现PC端靠边悬浮球的代码
May 09 Javascript
vue大型项目之分模块运行/打包的实现
Sep 21 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
实用函数2
2007/11/08 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
浅谈Python NLP入门教程
2017/12/25 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
利用python画出折线图
2018/07/26 Python
python实现日志按天分割
2019/07/22 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
keras中的backend.clip用法
2020/05/22 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
什么是封装
2013/03/26 面试题
楼面经理岗位职责范本
2014/02/18 职场文书
个人自荐材料
2014/05/23 职场文书
保险专业求职信
2014/07/07 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
干部考核工作总结2015
2015/07/24 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL