VUE使用draggable实现组件拖拽


Posted in Vue.js onApril 06, 2022

实现步骤
1、导入draggable依赖

npm i -S vuedraggable


2、引入draggable

import draggable from "vuedraggable"


3、注册draggable

  components: {
     draggable
  },


4、使用draggable
html页面

    <div class="col-md-3">
      <draggable
        class="list-group"
        tag="ul"
        :list="this.list"
        v-bind="dragOptions"
        :move="onMove"
        @start="isDragging = true"
        @end="isDragging = false"
      >
        <div
          class="list-group-item"
          v-for="(item, index) in this.list"
          :key="item.value"
        >
          <span class="badge">{{ index }}</span>
          <span class="lefttitle">
            {{ item.name }}
          </span>
        </div>
      </draggable>
    </div>


定义属性和list 

 data() {
    return {
      list: [
        {
          name: "-姓名",
          value: "name",
        },
        {
          name: "-性别",
          value: "sex",
        },
        {
          name: "-年龄",
          value: "age",
        },
        {
          name: "-地址",
          value: "address",
        },
        {
          name: "-邮箱",
          value: "mailbox",
        },
      ],
      editable: true, //决定是否可拖动,为false则组件不可拖动
      isDragging: false,
    };
  },


定义移动方法

methods: {
 
    onMove({ relatedContext, draggedContext }) {
      const relatedElement = relatedContext.element;
      const draggedElement = draggedContext.element;
      return (
        (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed
      );
    },
  },


5、完整VUE代码

<template>
  <div class="fluid container">
    <div class="form-group form-group-lg panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title">组件拖拽实例</h3>
      </div>
      <div class="panel-body">
        <div class="checkbox">
          <label
            ><input type="checkbox" v-model="editable" />设置组件可拖拽</label
          >
        </div>
      </div>
    </div>
 
    <div class="col-md-3">
      <draggable
        class="list-group"
        tag="ul"
        :list="this.list"
        v-bind="dragOptions"
        :move="onMove"
        @start="isDragging = true"
        @end="isDragging = false"
      >
        <div
          class="list-group-item"
          v-for="(item, index) in this.list"
          :key="item.value"
        >
          <span class="badge">{{ index }}</span>
          <span class="lefttitle">
            {{ item.name }}
          </span>
        </div>
      </draggable>
    </div>
 
    <div class="list-group col-md-3">
      <pre>{{ listString }}</pre>
    </div>
  </div>
</template>
 
<script>
import draggable from "vuedraggable";
export default {
  components: {
    draggable,
  },
  data() {
    return {
      list: [
        {
          name: "-姓名",
          value: "name",
        },
        {
          name: "-性别",
          value: "sex",
        },
        {
          name: "-年龄",
          value: "age",
        },
        {
          name: "-地址",
          value: "address",
        },
        {
          name: "-邮箱",
          value: "mailbox",
        },
      ],
      list2: [],
      editable: true, //决定是否可拖动,为false则组件不可拖动
      isDragging: false,
      delayedDragging: false,
    };
  },
  methods: {
 
    onMove({ relatedContext, draggedContext }) {
      const relatedElement = relatedContext.element;
      const draggedElement = draggedContext.element;
      return (
        (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed
      );
    },
  },
  computed: {
    dragOptions() {
      return {
        animation: 0,
        group: "description",
        disabled: !this.editable,
        ghostClass: "ghost",
      };
    },
    listString() {
      return JSON.stringify(this.list, null, 2);
    },
  },
  watch: {
    isDragging(newValue) {
      if (newValue) {
        this.delayedDragging = true;
        return;
      }
      this.$nextTick(() => {
        this.delayedDragging = false;
      });
    },
  },
};
</script>
 
<style>
.flip-list-move {
  transition: transform 0.5s;
}
.no-move {
  transition: transform 0s;
}
.ghost {
  opacity: 0.5;
  background: #c8ebfb;
}
.list-group {
  min-height: 20px;
}
.list-group-item {
  cursor: move;
}
.list-group-item i {
  cursor: pointer;
}
</style>

 

Vue.js 相关文章推荐
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vue穿梭框实现上下移动
Jan 29 Vue.js
Vue接口封装的完整步骤记录
May 14 Vue.js
详解Vue的options
May 15 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
vue elementUI批量上传文件
Apr 26 Vue.js
教你部署vue项目到docker
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 #Vue.js
vue中div禁止点击事件的实现
Apr 02 #Vue.js
Vue组件更新数据v-model不生效的解决
Apr 02 #Vue.js
Vue+TypeScript中处理computed方式
Apr 02 #Vue.js
Vue+Flask实现图片传输功能
Apr 01 #Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 #Vue.js
You might like
php预定义常量
2006/12/25 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
JavaScript 调试器简介
2009/02/21 Javascript
js下用gb2312编码解码实现方法
2009/12/31 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
Jquery性能优化详解
2014/05/15 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
python分析网页上所有超链接的方法
2015/05/08 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python实现银行管理系统
2019/10/25 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
检察官就职演讲稿
2014/01/13 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python