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布局文 ...
随机推荐
- oracle11g在没DNS情况下failover的配置方法
1.Oracle 11g引入scan ip ,可在没有DNS的情况下,客户端连接RAC配置failover时,很多情况还是使用oracle10g方式.即在客户端tnsname.ora中配置failov ...
- 高性能mysql-----MySQL_explain关键字分析查询语句(一)
转载地址:https://www.cnblogs.com/xpp142857/p/7373005.html MySQL_explain关键字分析查询语句 通过对查询语句的分析,可以了解查询语句的执 ...
- POJ 1753 bfs+位运算
T_T ++运算符和+1不一样.(i+1)%4 忘带小括号了.bfs函数是bool 型,忘记返回false时的情况了.噢....debug快哭了...... DESCRIPTION:求最少的步骤.使得 ...
- 组数排序非sort
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- Nutch相关视频教程3
参考: http://www.cnblogs.com/huligong1234/p/3515214.html
- L1-020 帅到没朋友
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(≤100),是已知朋友圈的个数:随后N行,每行首先给 ...
- ESXi6.5中将虚拟机从厚置备转换为精简置备
本文来自:https://blog.csdn.net/wangjingkaibear/article/details/77097041 用ESXi做虚拟化,创建了一个原始虚拟机并安装好系统做好基本设置 ...
- 基于Eclipse的Android开发环境搭建
1. Java开发环境搭建 1.1 JDK下载安装 JDK(Java Development Kit )是针对Java开发人员发布的软件开发工具包.JDK 是整个Java的核心,包括了Java运行 ...
- Excel 设置标题栏
1. 选中列表标题行, 可以设置字体居中显示,并放大字体以表示这是标题栏. 2. 选中列表第一数据行,即列表标题行下一行,选择View > Freeze Panes.
- [LeetCode&Python] Problem 806. Number of Lines To Write String
We are to write the letters of a given string S, from left to right into lines. Each line has maximu ...