当前位置:首页 > VUE

vue.js实现拖拽

2026-01-21 21:39:22VUE

Vue.js 实现拖拽功能

Vue.js 提供了多种方式实现拖拽功能,既可以利用原生 HTML5 的拖放 API,也可以借助第三方库如 vuedraggable。以下是两种常见实现方法:

使用 HTML5 原生拖放 API

HTML5 提供了 draggable 属性以及相关事件(dragstartdragenddragoverdrop 等),结合 Vue 的数据绑定可以实现基础拖拽功能。

模板部分:

vue.js实现拖拽

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

脚本部分:

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.setData('text/plain', item.id);
    },
    handleDrop(event, targetItem) {
      if (this.draggedItem === targetItem) return;

      const draggedIndex = this.items.findIndex(item => item.id === this.draggedItem.id);
      const targetIndex = this.items.findIndex(item => item.id === targetItem.id);

      this.items.splice(draggedIndex, 1);
      this.items.splice(targetIndex, 0, this.draggedItem);
    }
  }
};
</script>

使用 vuedraggable

vuedraggable 是基于 Sortable.js 的 Vue 组件,提供了更简单易用的 API 和丰富的功能(如动画、跨列表拖拽等)。

vue.js实现拖拽

安装:

npm install vuedraggable

使用示例:

<template>
  <draggable 
    v-model="items" 
    @end="onDragEnd"
  >
    <div v-for="item in items" :key="item.id">
      {{ item.text }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成后的顺序:', this.items);
    }
  }
};
</script>

跨列表拖拽

vuedraggable 支持跨列表拖拽,只需通过 group 属性指定相同的分组名:

<template>
  <div class="container">
    <draggable 
      v-model="list1" 
      group="items" 
      class="list"
    >
      <div v-for="item in list1" :key="item.id">
        {{ item.text }}
      </div>
    </draggable>

    <draggable 
      v-model="list2" 
      group="items" 
      class="list"
    >
      <div v-for="item in list2" :key="item.id">
        {{ item.text }}
      </div>
    </draggable>
  </div>
</template>

注意事项

  • 原生 API 需要手动处理数据更新,而 vuedraggable 自动同步数据。
  • 移动端兼容性可能需要额外处理(如 touch 事件)。
  • 复杂场景(如拖拽排序表格)建议使用 vuedraggable 的进阶配置(如 handle 属性限制拖拽区域)。

标签: 拖拽vue
分享给朋友:

相关文章

vue怎么实现动画

vue怎么实现动画

Vue 动画实现方法 Vue 提供了多种方式实现动画效果,包括内置过渡系统、第三方库集成以及 CSS 动画。以下是常见实现方法: 使用 Vue 过渡系统 通过 <transition>…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPa…

vue实现表格多行修改

vue实现表格多行修改

实现多行编辑表格 在Vue中实现表格的多行编辑功能,可以通过以下方法完成。这里以Element UI的表格组件为例,但思路适用于其他UI库或原生实现。 数据准备 定义表格数据和编辑状态管理变量:…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keyword…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-se…

实现 vue ssr

实现 vue ssr

Vue SSR 实现方法 Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法: 基础配置 安装必要依赖…