Vue的v-for中列表项拖拽排序详细方法

首先:HTML中,关键点是监听拖拽的三个阶段,即:dragstart/dragover/dragend,注意:要拖拽元素必须加上draggable="true"

<ul @dragstart="onDragStart"    @dragover="onDragOver"    @dragend="onDragEnd"    ref="taskListUl">  <li v-for="(subTask,index) in subTaskList"      draggable="true"      :id="subTask.id"      :key="subTask.id">    <el-row>      <el-col :lg="20">        <div  class="main">          <el-row>            <el-col :span="3"><el-checkbox></el-checkbox></el-col>            <el-col :span="21" class="taskEdit" v-if="show.isShowEdit !== index" :title="subTask.name">{{subTask.name}}</el-col>            <el-col :span="21" v-else>              <el-row style="width: 300px;">                <el-form ref="taskEditForm" :model="subTask">                  <el-col :span="14">                    <el-input v-model="subTask.name" size="mini"                              @keyup.enter.native="saveSubTask(‘subTaskForm‘,subTask);showEditTitle()"></el-input>                  </el-col>                  <el-col :span="10">                    <el-button type="primary" style="font-size:12px;color:#fff;margin-left:4px;padding:5px 8px;border:0;"                               size="mini" @click="saveSubTask(‘subTaskForm‘,subTask);handleTaskEdit()">保存</el-button>                    <el-button style="font-size:12px;padding:5px 8px;border:0;" size="mini" @click="handleTaskEdit">取消</el-button>                  </el-col>                </el-form>              </el-row>            </el-col>          </el-row>        </div>        <div class="icon1" v-if="show.isShowEdit !== index">          <el-button circle size="mini" @click="handleTaskEdit(index)"><i class="el-icon-edit"></i></el-button>          <el-button circle size="mini" @click="handleTaskDelete(index,subTask.id)"><i class="el-icon-delete"></i></el-button>        </div>        <div class="icon2">          <el-button circle size="mini"><i class="el-icon-s-finance"></i></el-button>          <el-button circle size="mini"><i class="el-icon-user"></i></el-button>        </div>      </el-col>    </el-row>  </li></ul>其次,JavaScript中data() {  return {    subTaskList: []
  }},methods: {
onDragStart(event){     //用于在拖拽开始时获取被拖拽元素  console.log("drag start")  this.draging=event.target;  console.log(this.draging);},onDragOver(event){    //用于在拖拽过程中,获取拖拽元素经过的对象,以及对元素顺序做出调整  console.log(‘drag move‘);  this.target=event.path[5];    //li的位置  let targetTop=event.target.getBoundingClientRect().top;  let dragingTop=this.draging.getBoundingClientRect().top;  if (this.target.nodeName === "LI"&&this.target !== this.draging) {    if (this.target) {      if (this.target.animated) {        return;      }    }    if(this._index(this.draging)<this._index(this.target)){      this.target.parentNode.insertBefore(this.draging,this.target.nextSibling);    }else{      this.target.parentNode.insertBefore(this.draging, this.target);    }    this._anim(targetTop,this.target);    this._anim(dragingTop,this.draging);  }},_anim(startPos,dom) {    //用于重绘元素  let offset = startPos - dom.getBoundingClientRect().top;  dom.style.transition = "none";  dom.style.transform = `translateY(${offset}px)`;  //触发重绘  dom.offsetWidth;  dom.style.transition="transform .3s";  dom.style.transform=``;  clearTimeout(dom.animated);  dom.animated=setTimeout(()=>{    dom.style.transition="";    dom.style.transform=``;    dom.animated=false;  },300)},onDragEnd(event){   //结束后跟俊最终拖拽调整subTaskList数组
  console.log(‘drag end‘);  //获取排序后的li节点数组  let currentNodes=Array.from(this.$refs.taskListUl.childNodes);  let newArr = [];  for(let i=0;i<currentNodes.length;i++) {    for(let j=0;j<this.subTaskList.length;j++) {      if(currentNodes[i].id == this.subTaskList[j].id){        newArr[i] = this.subTaskList[j];      }    }  }  this.subTaskList = newArr;  console.log(this.subTaskList);},

_index(el){    //用于根据元素id来获取对应元素的索引值
  let domData=Array.from(this.$refs.taskListUl.childNodes);  return domData.findIndex((currentValue,index,arr)=>{    return el.id == currentValue.id;  });},
}

原文地址:https://www.cnblogs.com/yccg990118/p/11212338.html

时间: 2024-10-05 00:20:35

Vue的v-for中列表项拖拽排序详细方法的相关文章

一款优雅的小程序拖拽排序组件实现

前言 最近po主写小程序过程中遇到一个拖拽排序需求. 上网一顿搜索未果, 遂自行实现. 这次就不上效果图了, 直接扫码感受吧. 灵感 首先由于并没有啥现成的小程序案例给我参考. 所以有点无从下手, 那就找个h5的拖拽实现参考参考. 于是在jquery插件网看了几个拖拽排序实现后基本确定了思路. 大概就是用 transform 做变换. 是的, 灵感这种东西就是借鉴过来的-- 确定需求 要能拖拽, 毕竟是拖拽排序嘛, 拖拽肯定是第一位. 要能排序, 先有拖拽后有天 -- 跑偏了, 拖拽完了肯定是要

ListView列表拖拽排序

ListView列表拖拽排序可以参考Android源代码下的Music播放列表,他是可以拖拽的,源码在[packages/apps/Music下的TouchInterceptor.java下]. 首先是搭建框架,此处的ListView列表类似于QQ消息列表,当然数据只是模拟,为了简单起见,没有把ListView的条目的所有的属性全部写上.首先是消息的实体类Msg.java: package me.chenfuduo.mymsgdrag; public class Msg { private in

win32 sdk树形控件的项拖拽实现

本课中,我们将学习如何使用树型视图控件.另外还要学习如何在树型视图中完成拖-拉动作,以及如何使用图象列表. 理论: 树型视图是一种特别的窗口,我们可以使用它一目了然地表示某种层次关系.譬如象在资源管理器中左边窗口中的就是树型视图.您可以调用CreateWindowEx来创建树型视图,传递一个类名""SysTreeView32"",或者您也可以把它放到一个对话框中去.不要忘了在您的代码中加入InitCommonControls函数. 树型视图有几种特有的风格.下面是几

Qt之QAbstractItemView视图项拖拽(二)

一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所以可定制性也就没有了那么强,最明显的是,这个类在执行exec方法后,mouse系列的回调接口就被阻塞了,随之而来的问题就是拖拽时item项没有了hover特性,为了解决这个问题,我们就不能使用QDrag类来实现拖拽了,这也是这篇文章我要讲述的内容. 二.效果展示 如图1是demo的效果展示,比较丑,

列表拖拽排序功能

前几天在做项目的时候,遇到一个表格里边的数据通过上下拖拽来改变其排序方式,后来通过一阵查找,发现jquery-ui提供了sortable这个方法,甚是欢喜,在此便把我写的小demo奉上: <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width

jquery -- 拖拽排序分析

今天应一个朋友的委托,研究一下拖拽排序,我记得我上次写拖拽排序,因为方法太死板,效果我一直不是很满意,一直想再从写一个,一直没机会(懒),这次因为公司部门变动所以有了一些时间(无聊)来写,本来准备使用Vue写,奈何功夫不到家在自定义指令的时候,问题卡住了,研究了一段时间之后,还是决定放弃,研究一下Vue再来写过,所以本次还是用了Jquery来写. 直接上代码 这是CSS部分 1 *{/*Css*/ 2 margin: 0px; 3 padding: 0px; 4 list-style: none

自定义控件——可拖拽排序的ListView

前言 最经研究了一下拖拽排序的ListView,跟酷狗里的播放列表排序一样,但因为要添加自己特有的功能,所以研究了好长时间.一开始接触的是GitHub的开源项目--DragSortListView,实现的效果和流畅度都很棒.想根据他的代码自己写一个,但代码太多了,实现的好复杂,看别人的代码你懂的了,就去尝试寻找其他办法.最后还是找到了更简单的实现方法,虽然跟开源项目比要差一点,但对我来说可以了,最重要的是完全可以自定义. 实现的效果如下: 主要问题 如何根据触摸的位置确定是哪个条目? ListV

RecyclerView实现条目Item拖拽排序与滑动删除

RecyclerView实现条目Item拖拽排序与滑动删除 版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 效果演示 直播视频讲解:[http://pan.baidu.com/s/1miEOtwG1 推荐大家结合我直播的视频看效果更好. 本博客源码传送门. 需求和技术分析 RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮. RecyclerView Item滑动删除:

使用knockout-sortable实现对自定义菜单的拖拽排序

在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需要说明的是排序的实现. 我们先来看看关键的页面代码: <div class="row"> <div class="col-lg-12 full-width" id="leftMenus"> <div class=&quo