【VUE】draggable-实现组件拖拽实例

本文展示了如何在 Vue.js 应用中使用 vuedraggable 库实现组件的拖放功能。通过导入、注册 draggable 组件,结合 data 和 methods 中的配置,可以创建一个可编辑的列表,用户可以通过勾选复选框来开启或关闭拖放功能。拖放过程中,通过 onMove 方法确保只有非固定的元素才能被移动。完整代码包括模板、样式和方法,使得组件拖放过程平滑且可控。
摘要由CSDN通过智能技术生成

使用draggable实现组件拖拽

 

实现步骤

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-draggable-plus`是一个基于Vue.js框架的组件库,专门用于实现元素的拖拽功能。它在处理用户在页面上对元素进行拖动、缩放等操作方面提供了便捷的功能集。 支持滚动条滚动拖拽是`vue-draggable-plus`的一个关键特性。这意味着当用户在一个具有大量内容的页面上尝试移动某个元素时,该元素可以随着滚动条的滚动而继续被拖动。这一特性的实现使得用户可以在滚动长列表或大文本块的情况下更方便地调整布局或选择特定项目。 要利用这个功能,你需要首先安装并引入`vue-draggable-plus`库到你的Vue项目中。接着,在组件模板中添加`<draggable>`标签,并为其绑定相应的属性来配置拖拽行为,包括滚动支持。 例如: ```html <template> <div ref="scrollContainer"> <!-- 其他HTML内容... --> <!-- 开始拖拽区域 --> <div class="draggableArea" draggable="true"> <!-- 您需要拖动的内容... --> </div> <!-- 结束拖拽区域 --> </div> </template> <script> import draggablePlus from 'vue-draggable-plus' export default { components: { draggablePlus }, mounted() { this.$nextTick(() => { // 使用自定义选项启用滚动支持 this.$refs.scrollContainer.addEventListener('wheel', () => { this.draggableInstance?.startDrag(); }); const draggableInstance = this.draggableInstance; if (draggableInstance) { draggableInstance.start(); } }); }, data() { return { draggableInstance: null, }; }, }; </script> ``` 在这个例子中,我们通过给元素添加`draggable="true"`属性开启了拖拽功能。然后,为了支持滚动时的拖拽,我们在滚动事件触发时启动拖拽实例开始拖动过程。这会确保在滚动页面时,用户仍然能准确控制所选元素的位置。 关于`vue-draggable-plus`的更多信息,你可以查阅其官方文档,了解更多高级配置选项及示例应用。了解如何恰当地使用滚动事件监听和其他API来优化用户体验是非常重要的。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值