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 插槽简介及使用示例
Nov 19 Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
Vue实现简单购物车功能
Dec 13 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
详解Vue的七种传值方式
Feb 08 Vue.js
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
教你部署vue项目到docker
Apr 05 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
Destoon实现多表查询示例
2014/08/21 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
python 切片和range()用法说明
2013/03/24 Python
python复制与引用用法分析
2015/04/08 Python
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python中的延迟绑定原理详解
2019/10/11 Python
10张动图学会python循环与递归问题
2021/02/06 Python
优秀团员个人事迹材料
2014/01/29 职场文书
辩论赛主持词
2014/03/18 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
呐喊读书笔记
2015/06/30 职场文书
假期读书倡议书3篇
2019/08/19 职场文书