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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
vue-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
vue使用element-ui实现表单验证
Dec 13 Vue.js
vue 数据操作相关总结
Dec 17 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 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
Zerg基本策略
2020/03/14 星际争霸
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
Javascript学习笔记5 类和对象
2010/01/11 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
python实现apahce网站日志分析示例
2014/04/02 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
一道python走迷宫算法题
2018/01/22 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
《故乡》教学反思
2014/04/10 职场文书
小学生评语集锦
2014/04/18 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
个人收入证明范本
2014/09/18 职场文书
2014年路政工作总结
2014/12/10 职场文书
青年文明号汇报材料
2014/12/23 职场文书
2015年女生节活动总结
2015/02/27 职场文书