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 相关文章推荐
javascript下数值型比较难点说明
Jun 07 Javascript
js几秒以后倒计时跳转示例
Dec 26 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
Jun 06 Javascript
火狐下input焦点无法重复获取问题的解决方法
Jun 16 Javascript
jquery实现textarea输入框限制字数的方法
Jan 15 Javascript
跟我学习javascript的严格模式
Nov 16 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
Aug 11 Javascript
vue 的keep-alive缓存功能的实现
Mar 22 Javascript
vue实现2048小游戏功能思路详解
May 09 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
Aug 20 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 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或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
python 实现矩阵按对角线打印
2019/11/29 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
python实现取余操作的简单实例
2020/08/16 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
文科生自我鉴定
2014/02/15 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
教职工代表大会主持词
2014/04/01 职场文书
商超业务员岗位职责
2015/02/13 职场文书
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers