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
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
vue实现登陆页面开发实践
May 30 Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 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
第十一节 重载 [11]
2006/10/09 PHP
php生成EXCEL的东东
2006/10/09 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
web.py中调用文件夹内模板的方法
2014/08/26 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
用python制作游戏外挂
2018/01/04 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
利用python求积分的实例
2019/07/03 Python
python中update的基本使用方法详解
2019/07/17 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
设备动力科岗位职责范本
2014/02/23 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
新闻编辑求职信
2014/04/09 职场文书
企业文化宣传标语
2014/06/09 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
施工安全员岗位职责
2015/04/11 职场文书
童年读书笔记
2015/06/26 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
nginx七层负载均衡配置详解
2022/07/15 Servers