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下载后台传过来的乱码流的问题
Dec 05 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
如何管理Vue中的缓存页面
Feb 06 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
详细聊聊vue中组件的props属性
Nov 02 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
vue使用watch监听属性变化
Apr 30 Vue.js
vue如何清除浏览器历史栈
May 25 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中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
jQuery 浮动广告实现代码
2008/12/25 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
ptyhon实现sitemap生成示例
2014/03/30 Python
Python 字典dict使用介绍
2014/11/30 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
Python如何读取文件中图片格式
2020/01/13 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
思想作风建设心得体会
2014/10/22 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
学校学期工作总结
2015/08/13 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL