vue2.0 不引用第三方包的情况下实现嵌套对象的拖拽排序功能
先上一张效果图,然后再上代码(由于只做效果,未做数据相关的处理:实际处理数据时不修改 dom 元素,只是利用 dom 元素传递数据,然后需改数据,靠数据驱动效果)

<div :id="index+'_morning'" style="min-height: 20px;" @drop='drop($event)' @dragover='allowDrop($event)'>
<li style="padding:0 0 5px 0">
<span class="type-icon time">上</span>上午(morning)
</li>
<template v-if="item.morning !== undefined">
<template v-for="(itemSon,idIdx) in item.morning">
<li class="item ui-sortable-handle" :id="index+'_morning_'+idIdx" draggable='true' @dragstart='drag($event)' @drop='drop($event)' @dragover='allowDrop($event)'>
<span class="destination-name">
<em class="ball ball-red">{{itemSon.node_sort}}</em>
<a href="javascript:;" class="item-name">{{itemSon.name}}</a>
<NodeSetMore @click="onEventPoi(itemSon)" :poi="itemSon" v-on:poiOperate="onPoiOperate"></NodeSetMore>
<DisplayIcon :poi="itemSon"></DisplayIcon>
</span>
</li>
</template>
</template>
</div>
methods: {
// 拖拽相关
drag:function(event){
console.log('拖动事件', event)
this.dom = event.currentTarget
},
drop:function(event){
event.preventDefault();
// 组织事件的传播(防止冒泡,节点向节点容器冒泡,因为都监听了此事件)
event.cancelBubble = true;
console.log('源对比', event.target, event.currentTarget)
console.log('目标id', event.currentTarget.id)
// 为event.currentTarget(点击事件本身)
// 分割id 2_morning格式为容器;2_morning_0为容器下的节点:
const idPath = event.currentTarget.id.split('_');
if (idPath.length === 2) {
event.currentTarget.appendChild(this.dom);
} else if(idPath.length === 3) {
// 获取当前排序第几,然后插在这个元素之后
event.currentTarget.parentNode.appendChild(this.dom);
// 重新改变顺序data中的数组顺序
this.againSort()
} else {
console.log("暂不处理", event.target)
}
//// 数据处理阶段,如果是节点容器,直接插在最前面,如果是节点,则放在这个节点后面
// // 不改变dom节点,直接改变数据
// this.tripList['1']['morning'].splice(0, 1);
// this.againSort()
},
allowDrop:function(event){
event.preventDefault();
// 组织事件的传播
event.cancelBubble = true;
}
}
主要关注点在于 event.target 和 event.currentTarget 的理解,一个是事件触发时点击的元素(如:span),一个是事件触发时点击绑定事件的元素(如:li @drop)
vue2.0 不引用第三方包的情况下实现嵌套对象的拖拽排序功能的更多相关文章
- vue2.0学习笔记之路由(二)路由嵌套+动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0学习笔记之路由(二)路由嵌套
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」
很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...
- java 哪些情况下会使对象锁释放
Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...
- golang引用第三方包的报错:no required module provides package [完美解决]
关于golang第三方包的引用报错:no required module provides package : go.mod file not found in current directory o ...
- 如何在不使用系统函数的情况下实现PHP中数组系统函数的功能
PHP中为我们提供了各种各样的系统函数来实现我们需要的各种功能,那么,在不使用系统函数的情况下我们要怎样来实现这些功能呢?以下就是几种系统函数的实现方式. 首先,我们来定义一个数组: $arr= ar ...
- 在vue2.0中引用element-ui组件库
element-ui是由饿了么团队开发的一套基于 Vue 2.0 的桌面端组件库. 官网:http://element.eleme.io/ 安装 npm i element-ui -S 引用完整的el ...
- Xamarin引用第三方包错误解决方法
http://www.cnblogs.com/ThenDog/p/7623720.html
- 自定义ListView适配器Adapter引用布局文件的情况下实现点击列表项时背景颜色为灰色
listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文 ...
随机推荐
- 基于PU-Learning的恶意URL检测——半监督学习的思路来进行正例和无标记样本学习
PU learning问题描述 给定一个正例文档集合P和一个无标注文档集U(混合文档集),在无标注文档集中同时含有正例文档和反例文档.通过使用P和U建立一个分类器能够辨别U或测试集中的正例文档 [即想 ...
- javascript primise本质——为了简化异步编码而针对异步操作的代理
概述 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 语法 new Promise(executor); new Promise(functio ...
- 管道与popen函数与重定向
转自:http://www.tldp.org/LDP/lpg/node12.html Pipes the Easy Way! LIBRARY FUNCTION: popen(); PROTOTYPE: ...
- elasticsearch配置详解
一.说明 使用的是新版本5.1,直接从官网下载rpm包进行安装,https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5 ...
- linux page allocation and deallocation
All of the physical pages in the system are described by the mem_map data structure which is a li ...
- ps和fireworks切图网页优化,jpg为80时
- 为什么要使用encodeURL转换URL编码?
参考: https://www.cnblogs.com/haitao-fan/p/3399018.html http://www.ruanyifeng.com/blog/2010/02/url_enc ...
- MyEclipse 2017 CI 10 发布(附下载)
挑战全年最低价!MyEclipse线上狂欢仅剩最后3天!立即抢购>> 2017 CI 10主要是一个错误修复版本,这个版本为Angular和TypeScript工具提供了重要的修复,并为I ...
- net start mysql启动mysql,提示发生系统错误 5 拒绝访问 解决方法
解决问题方法如下: 在dos下运行net start mysql 不能启动mysql!提示发生系统错误 5:拒绝访问!切换到管理员模式就可以启动了.所以我们要以管理员身份来运行cmd程序来启动mys ...
- iOS开发之旅:实现一个APP界面框架
在上一篇博客中,给大家介绍了一下我们传统的 APP 界面框架-标签导航的一些优缺点,在这篇文章中我会来给大家演示,如何用代码去实现这一框架.本次的实现我会分成俩部分来讲,好了闲话少说,接下来进入到开发 ...