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+iview实现分页及查询功能
Nov 17 Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
详解Vue router路由
Nov 20 Vue.js
Vue组件更新数据v-model不生效的解决
Apr 02 Vue.js
如何优化vue打包文件过大
Apr 13 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python使用knn实现特征向量分类
2018/12/26 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
SQL Server面试题
2013/04/04 面试题
小学生元旦广播稿
2014/02/21 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
暖春观后感
2015/06/08 职场文书
校运会通讯稿
2015/07/18 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js