当前位置: 首页 > article >正文

vue实现拖拽,可实现排序拖拽和自由拖拽(vuedraggable)

vuedraggable是一个vue的拖拽插件,可实现排序拖拽和自由拖拽,使用步骤和代码示例如下:

1、安装vuedraggable

npm install vuedraggable

2、页面引入

import draggable from 'vuedraggable';

3、示例:

 实现顺序拖拽:

这种是最常规的简单用法。可用于列表拖拽排序等。拖拽后的componentList就是按照顺序排列好的。

<template>
  <div class='testPage' ref='testPage'>
    <draggable
      :list="componentList"
      ghost-class="ghost"
      chosen-class="chosenClass"
      animation="300"
      @start="onStart"
      @end="onEnd"
      class="draggable"
    >
      <template #item="{ element }">
        <div class='item' style='width: 200px; height: 40px; border: 1px solid #EEEEEE;'>
           {{element.name}}
        </div>
      </template>
    </draggable>
  </div>
</template>
import draggable from 'vuedraggable';

export default {
  name: 'wel',
  components: {draggable},
  data() {
    return {
      componentList: [
        {
          id: 1,
          name: '测试1'
        },
        {
          id: 2,
          name: '测试2'
        },
        {
          id: 3,
          name: '测试3'
        },
        {
          id: 4,
          name: '测试4'
        },
        {
          id: 5,
          name: '测试5'
        }
      ],
      offsetX: 0,
      offsetY: 0,
      pageY: 0,
      pageX: 0
    };
  },
  computed: {},
  created() {},
  methods: {
    onStart() {

    },
    onEnd(e) {

    }
  },
};
.testPage {
  .draggable {
    width: 100%;
    height: 100%;
    position: relative;
  }
  .item {
    background: #FFFFFF;
  }
  .item:hover {
    cursor: move;
  }
  .ghost {
    border: solid 1px rgb(19, 41, 239);
  }
  .chosenClass {
    background-color: #f1f1f1;
  }
}

实现随意位置拖拽:

可随意位置拖拽,不用相邻,也不用排序,其实就是在原基础上把所有元素绝对定位,然后动态计算出移动后元素的位置,动态设置top和left值。

<template>
  <div class='testPage' ref='testPage'>
    <draggable
      :list="componentList"
      ghost-class="ghost"
      chosen-class="chosenClass"
      animation="300"
      @start="onStart"
      @end="onEnd"
      class="draggable"
      :sort='false'
    >
      <template #item="{ element }">
        <div class='item' style='width: 200px; height: 200px; position: absolute;  border: 1px solid #EEEEEE;' @mousedown='mousedownHandle'>
        {{element.name}}
        </div>
      </template>
    </draggable>
  </div>
</template>
import draggable from 'vuedraggable';

export default {
  name: 'wel',
  components: {draggable},
  data() {
    return {
      componentList: [
        {
          id: 1,
          name: '测试1'
        },
        {
          id: 2,
          name: '测试2'
        },
        {
          id: 3,
          name: '测试3'
        },
        {
          id: 4,
          name: '测试4'
        },
        {
          id: 5,
          name: '测试5'
        }
      ],
      offsetX: 0,
      offsetY: 0,
      pageY: 0,
      pageX: 0
    };
  },
  computed: {},
  created() {},
  methods: {
    onStart() {

    },
    onEnd(e) {
      e.item.style.top = e.originalEvent.pageY - this.offsetY - this.pageY + 'px';
      e.item.style.left = e.originalEvent.pageX - this.offsetX - this.pageX + 'px';
    },
    mousedownHandle(e) {
      this.offsetX = e.offsetX;
      this.offsetY = e.offsetY;
      var rectInfo = this.$refs.testPage.getBoundingClientRect();
      this.pageX = rectInfo.left;
      this.pageY = rectInfo.top;
    }
  },
};
.testPage {
  background: url("@/assets/images/map_bg.png") no-repeat center center !important;
  background-size: 100% 100%;
  position: relative;
  .draggable {
    width: 100%;
    height: 100%;
    position: relative;
  }
  .item {
    background: #FFFFFF;
  }
  .item:hover {
    cursor: move;
  }
  .ghost {
    border: solid 1px rgb(19, 41, 239);
  }
  .chosenClass {
    background-color: #f1f1f1;
  }
}


http://www.kler.cn/a/390670.html

相关文章:

  • 11张思维导图带你快速学习java
  • IEC60870-5-104 协议源码架构详细分析
  • adb shell常用命令
  • 解决:WSL2可视化opencv和pyqt冲突:QObject::moveToThread
  • 科技云报到:数字化转型,从不确定性到确定性的关键路径
  • #渗透测试#SRC漏洞挖掘#云技术基础02之容器与云
  • lnmp:自己的“百度网盘”
  • SpringBoot自动装配原理解析
  • Android 生成并加载PDF文件
  • 豆包大模型团队开源RLHF框架,破解强化学习训练部署难题
  • AI猫娘第二弹 | 基于Text和Chat模型实现文本生成
  • Oceanbase-Topk直方图
  • 【C++】基础语法概念
  • web安全漏洞之xss(1)
  • vue常见题型(10-15)
  • 在AutoDL上部署一个自定义的Python环境并在pycharm上使用
  • Java面试要点06 - static关键字、静态属性与静态方法
  • JavaScript如何操作HTML:动态网页构建指南
  • 数据结构---排序总结
  • Rust实战项目与未来发展——跨平台应用开发项目实践
  • SpringMVC学习记录(三)之响应数据
  • Webserver(5.6)服务器压力测试
  • Cross Modal Transformer: Towards Fast and Robust 3D Object Detection
  • Linux - 弯路系列1:xshell能够连接上linux,但xftp连不上(子账号可以连接,但不能上传数据)
  • 工位管理智能化:Spring Boot企业级平台
  • 如何自己实现事件的订阅和发布呢?