当前位置:首页 > VUE

vue实现可拖拽排列

2026-02-24 00:04:37VUE

Vue实现可拖拽排列

使用Vue实现可拖拽排列功能可以通过原生HTML5的拖放API或第三方库如vuedraggable来实现。以下是两种方法的详细说明:

使用HTML5原生拖放API

HTML5提供了原生的拖放API,可以通过draggable属性和相关事件实现拖拽排序。

<template>
  <div>
    <div
      v-for="(item, index) in items"
      :key="item.id"
      draggable="true"
      @dragstart="handleDragStart(index)"
      @dragover.prevent="handleDragOver(index)"
      @drop="handleDrop(index)"
      class="draggable-item"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' },
      ],
      draggedIndex: null,
    };
  },
  methods: {
    handleDragStart(index) {
      this.draggedIndex = index;
    },
    handleDragOver(index) {
      if (this.draggedIndex !== index) {
        const draggedItem = this.items[this.draggedIndex];
        this.items.splice(this.draggedIndex, 1);
        this.items.splice(index, 0, draggedItem);
        this.draggedIndex = index;
      }
    },
    handleDrop(index) {
      this.draggedIndex = null;
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

使用vuedraggable库

vuedraggable是一个基于Sortable.js的Vue组件,提供了更简单的方式实现拖拽排序。

安装依赖:

npm install vuedraggable

使用示例:

<template>
  <div>
    <draggable v-model="items" tag="ul" item-key="id">
      <template #item="{ element }">
        <li class="draggable-item">
          {{ element.name }}
        </li>
      </template>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' },
      ],
    };
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  list-style: none;
}
</style>

自定义拖拽样式

可以通过CSS和事件处理自定义拖拽过程中的样式效果。

vue实现可拖拽排列

<template>
  <div>
    <div
      v-for="(item, index) in items"
      :key="item.id"
      draggable="true"
      @dragstart="handleDragStart(index)"
      @dragover.prevent="handleDragOver(index)"
      @dragenter="handleDragEnter(index)"
      @dragleave="handleDragLeave(index)"
      @drop="handleDrop(index)"
      :class="['draggable-item', { 'dragging': draggedIndex === index, 'drag-over': dragOverIndex === index }]"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' },
      ],
      draggedIndex: null,
      dragOverIndex: null,
    };
  },
  methods: {
    handleDragStart(index) {
      this.draggedIndex = index;
    },
    handleDragOver(index) {
      if (this.draggedIndex !== index) {
        this.dragOverIndex = index;
      }
    },
    handleDragEnter(index) {
      this.dragOverIndex = index;
    },
    handleDragLeave(index) {
      this.dragOverIndex = null;
    },
    handleDrop(index) {
      if (this.draggedIndex !== null && this.draggedIndex !== index) {
        const draggedItem = this.items[this.draggedIndex];
        this.items.splice(this.draggedIndex, 1);
        this.items.splice(index, 0, draggedItem);
      }
      this.draggedIndex = null;
      this.dragOverIndex = null;
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
  transition: all 0.3s;
}
.dragging {
  opacity: 0.5;
}
.drag-over {
  border: 2px dashed #666;
}
</style>

注意事项

  • 使用原生API时,确保@dragover.prevent阻止默认行为以允许放置。
  • vuedraggable提供了更多高级功能如动画、跨列表拖拽等,适合复杂场景。
  • 拖拽操作可能涉及性能问题,对于大型列表建议使用虚拟滚动优化。

标签: 排列拖拽
分享给朋友:

相关文章

前端vue实现拖拽

前端vue实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现拆分拖拽

vue实现拆分拖拽

Vue 实现拆分拖拽功能 拆分拖拽通常指将一个元素拆分为多个部分,并允许用户通过拖拽重新排列或组合这些部分。以下是实现这一功能的几种方法: 使用 Vue.Draggable 库 Vue.Dragga…

vue 实现拖拽插件

vue 实现拖拽插件

Vue 拖拽插件实现方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以直接使用这些 API。…

vue怎么实现拖拽

vue怎么实现拖拽

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现拖拽上传

vue实现拖拽上传

Vue 拖拽上传实现方法 使用 HTML5 原生拖拽 API 在 Vue 中可以通过监听原生拖拽事件实现基础功能: <template> <div class="dr…

vue 实现拖拽布局

vue 实现拖拽布局

Vue 实现拖拽布局的方法 使用原生HTML5拖拽API 通过HTML5的draggable属性和Vue的事件绑定实现基础拖拽功能。在元素上添加draggable="true",并通过@dragsta…