当前位置:首页 > VUE

vue实现可拖拽排列

2026-02-24 00:04:37VUE

Vue实现可拖拽排列

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

使用HTML5原生拖放API

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

vue实现可拖拽排列

<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组件,提供了更简单的方式实现拖拽排序。

安装依赖:

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和事件处理自定义拖拽过程中的样式效果。

<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 和 drop…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…

vue实现carousel拖拽

vue实现carousel拖拽

实现拖拽轮播的基本思路 在Vue中实现可拖拽的Carousel组件需要结合触摸事件(touchstart、touchmove、touchend)和鼠标事件(mousedown、mousemove、mo…

vue实现拖拽放置

vue实现拖拽放置

Vue 实现拖拽放置功能 拖拽放置功能可以通过 Vue 的指令或第三方库实现。以下是两种常见的方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 dragga…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

vue 拖拽排序 实现

vue 拖拽排序 实现

实现拖拽排序的基本思路 在Vue中实现拖拽排序通常需要借助HTML5的拖放API或第三方库如sortablejs、vuedraggable等。以下是两种常见实现方式: 使用HTML5原生拖放API…