前端拖拽编辑功能

https://blog.csdn.net/weixin_41646716/article/details/82905765

<1>安装

通过NPM安装

$ npm install awe-dnd --save

插件应用
在main.js中,通过Vue.use导入插件

import VueDND from 'awe-dnd'
 
Vue.use(VueDND)

在你的vue文件中这样引用

<script>
export default {
  data () {
    return {
        colors: [{
            text: "Aquamarine"
        }, {
            text: "Hotpink"
        }, {
            text: "Gold"
        }, {
            text: "Crimson"
        }, {
            text: "Blueviolet"
        }, {
            text: "Lightblue"
        }, {
            text: "Cornflowerblue"
        }, {
            text: "Skyblue"
        }, {
            text: "Burlywood"
        }]
    }
  }
}
</script>
 
<template>
  <div class="color-list">
      <div 
          class="color-item" 
          v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color' }"
          :key="color.text"
      >{{color.text}}</div>
  </div>
</template>

vue2.0的使用方式

<div class="color-list">
    <div 
        class="color-item" 
        v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color' }"
        :key="color.text"
    >{{color.text}}</div>
</div>

vue1.0的使用方式

<div class="color-list">
    <div 
        class="color-item" 
        v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color', key: color.text }"
        track-by="text"
    >{{color.text}}</div>
</div>

添加事件

<div class="color-list">
    <div 
        class="color-item" 
        v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color', otherData: otherData }"
        :key="color.text"
    >{{color.text}}</div>
</div>

export default {
  mounted () {
    this.$dragging.$on('dragged', ({ value }) => {
      console.log(value.item)
      console.log(value.list)
      console.log(value.otherData)
    })
    this.$dragging.$on('dragend', () => {
        
    })
  }
}

组件参数
名称类型默认值说明


image.png

<2>vue 组件排列顺序

安装

npm install awe-dnd --save

main.js

import VueDND from 'awe-dnd'
 
Vue.use(VueDND)

sortable.vue

排序完后的操作挺重要的,因为我们一般排序完要重新提交排序后的数据给后台保存,以便下一次安装我们所需要的顺序显示,这里的list就可以帮我们做到这一点,但是我们需要给数据添加一个uniqueId标志。然后在排序完后或者列表对应的顺序和uniqueId提交给后台,我也不知道我说的你们能理解吗,反正你们也可以打印出来看看。

image.png

<3>

https://blog.csdn.net/u011384023/article/details/79762299

<4>

一个基于 Sortable.js 的vue拖拽插件 支持触屏操作 自动适应 draggable组件的v-model属性实现双向绑定。 如果要多个盒子互相拖拽,需定义options,将其group属性定义为同一个值即可 源码如下:

image.png

一个基于Sortable.js的vue拖拽插件
支持触屏操作
自动适应

image.png
image.png

就是这种感觉

draggable组件的v-model属性实现双向绑定。
如果要多个盒子互相拖拽,需定义options,将其group属性定义为同一个值即可
源码如下:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.min.js"></script>

<script src="http://cdn.jsdelivr.net/npm/sortablejs@1.7.0/Sortable.min.js"></script>

 

<script src="http://cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.15.0/vuedraggable.min.js"></script>

</head>

<body>

<div id="tuozhuai_view">

<!--  -->

<draggable  v-model="fruit" :options="{group:'people'}">

  <div v-for="element in fruit">{{element}}</div>

</draggable>

{{fruit}}

<br>

<br>

<draggable  v-model="girl" :options="{group:'people'}">

  <div v-for="element in girl">{{element}}</div>

</draggable>

{{girl}}

</div>

 

<script type="text/javascript">

new Vue({

el:'#tuozhuai_view',

data:{

fruit:['apple','banana','orage'],

girl:['linzhil','cjk','bdyjy'],

}

})

</script>

</body>

</html>

<5>https://blog.csdn.net/qq_40882724/article/details/80798135

:翻看vue文档发现可以注册全局指令,用于DOM元素的底层处理,这个挺靠谱。

Vue.directive( 指令名,{ 钩子函数 } )
image.png

3.思路:很简单:首先记录整个对话框距离文档边界的左边距和上边距(当然你监听右边距也oK的,但是别监听下边距,因为我们一般是设置上边距,饿了么也是如此。正如我们调整高度时,会说往下拉一点,或者往上去一点)。鼠标按下的时候监听mousedown事件,记录鼠标距离对话框边界的距离(左边距LEFT,上边距TOP).然后监听document的mousemove事件,因为我们不可能确保我们的鼠标一直都在框中拖拽,因为我们速度有慢有快,在mousemove中保证鼠标与对话框的位置跟mousedown时一致。鼠标mouseup时移除mousemove和mouseup的监听,下次对话框打开时再把它的位置还原如初。

image.png

5.贴上代码:

import Vue from 'vue'

let LEFT;

let TOP;

//指令的传参形式为<dialogo v-dialogdrag=" { target:'selector',container:'.box',dialogVisible:"传入对话框的visible变量" } "></dialog>

Vue.directive('dialogdrag',{

inserted(el,binding){

let container = el.querySelector(binding.value.container);

let target = el.querySelector(binding.value.target);

 
 
let temContainerWidth = getComputedStyle(container).width;

let temHtmlWidth = getComputedStyle(document.firstElementChild).width;

if(temContainerWidth.indexOf('%') != -1){

//百分值

LEFT = (

parseFloat(temHtmlWidth) -

parseFloat(temHtmlWidth) * temContainerWidth.substring(0,temContainerWidth.length-1)/100

)/2;

}else if(temContainerWidth.indexOf('px') != -1){

//像素值

LEFT = (

parseFloat(temHtmlWidth) -

parseFloat(temContainerWidth)

)/2;

}else{

//其他值

throw ('对话框容器宽度只能为像素或百分比!')

}

console.log(temContainerWidth);

console.log(temHtmlWidth);

//

let temMarginTop = getComputedStyle(container).marginTop;

if(temMarginTop && temMarginTop.indexOf('px') != -1){

//不为空并且以像素为单位

TOP = parseFloat(temMarginTop);

}else{

throw ('请设置对话框容器上边距margin-top并以像素为单位!')

}

console.log(LEFT)

//删除对话容器的行内样式(marginleft,margintop,marginbottom,marginrigth);

delete container.style.marginTop;

delete container.style.marginLeft;

delete container.style.marginRight;

delete container.style.marginBottom;

delete container.style.margin;

//赋值给marginTop;marginLeft;

container.style.marginTop = TOP+'px';

container.style.marginLeft = LEFT+'px';

 
//事件监听

target.addEventListener('mousedown',function(event){

//获取鼠标距离对话框容器的左上边距

let leftValue = event.clientX - parseFloat(getComputedStyle(container).marginLeft);

let topValue = event.clientY - parseFloat(getComputedStyle(container).marginTop);

document.addEventListener('mousemove',moveFn,true)

document.addEventListener('mouseup',upFn,true)

function moveFn(event){

console.log('还在移动')

target.style.cursor = 'move';

container.style.marginLeft = (event.clientX-leftValue)+'px';

container.style.marginTop = (event.clientY-topValue)+'px';

 
}

function upFn(event){

target.style.cursor = 'default';

document.removeEventListener('mousemove',moveFn,true);

//document.removeEventListener('mouseup',upFn);

}

})

},

componentUpdated(el,binding){

if(binding.value.dialogVisible){

//打开时还原对话框位置

el.querySelector(binding.value.container).style.marginTop = TOP+'px';

 
el.querySelector(binding.value.container).style.marginLeft = LEFT+'px';

 
}

}

})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,154评论 0 1
  • 简说Vue (组件库) https://github.com/ElemeFE/element" 饿了么出品的VUE...
    Estrus丶阅读 1,676评论 0 1
  • UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组...
    鲁大师666阅读 43,407评论 5 97
  • Vue2.0+组件库总结 UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基...
    szch阅读 1,977评论 1 52
  • 李坚已经一个小时没碰手机了,他在屋里转来转去 时间对他来说过得过分地慢,他随手拿起一本书翻了两页又随手扔一边 抬头...
    一派荒唐之癸巳年间阅读 477评论 0 1