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中通过render函数给子组件设置ref操作
Nov 17 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
vue实现简单数据双向绑定
Apr 28 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
Vue全局事件总线你了解吗
Feb 24 Vue.js
vue+iview实现手机号分段输入框
Mar 25 Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
vue 给数组添加新对象并赋值
Apr 20 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
javascript 数组学习资料收集
2010/04/11 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
jQuery操作css样式
2017/05/15 jQuery
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
ES6中异步对象Promise用法详解
2019/07/31 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
python决策树之CART分类回归树详解
2017/12/20 Python
flask 实现token机制的示例代码
2019/11/07 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
出生证明公证书
2014/04/09 职场文书
体育运动口号
2014/06/09 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript