当前位置:首页 > VUE

拖拽式编程vue实现

2026-02-25 19:07:30VUE

拖拽式编程在 Vue 中的实现方法

使用第三方库(如 vuedraggable

安装 vuedraggable 库:

npm install vuedraggable

在 Vue 组件中引入并使用:

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

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成');
    }
  }
};
</script>

原生 HTML5 拖拽 API 实现

通过 HTML5 的 draggable 属性和事件实现基础拖拽功能:

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

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.effectAllowed = 'move';
    },
    handleDrop(event, targetItem) {
      if (this.draggedItem === targetItem) return;
      const draggedIndex = this.items.indexOf(this.draggedItem);
      const targetIndex = this.items.indexOf(targetItem);
      this.items.splice(draggedIndex, 1);
      this.items.splice(targetIndex, 0, this.draggedItem);
    }
  }
};
</script>

自定义指令实现

创建 Vue 自定义指令处理拖拽逻辑:

<template>
  <div v-draggable v-for="item in items" :key="item.id">
    {{ item.name }}
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.draggable = true;
        el.addEventListener('dragstart', (e) => {
          e.dataTransfer.setData('text/plain', el.textContent);
        });
      }
    }
  },
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    };
  }
};
</script>

注意事项

  • 跨组件拖拽时需使用 group 属性(vuedraggable
  • 移动端兼容性需额外处理触摸事件
  • 复杂场景可结合 Vuex 管理拖拽状态
  • 性能优化:对于大量数据使用虚拟滚动

进阶功能示例

实现拖拽排序与位置交换:

拖拽式编程vue实现

<template>
  <div class="container">
    <div 
      v-for="(item, index) in items"
      :key="item.id"
      draggable="true"
      @dragstart="dragStart(index)"
      @dragover.prevent
      @dragenter="dragEnter(index)"
      @dragend="dragEnd"
      @drop="drop"
      :class="{ 'dragging': currentDragIndex === index }"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [/* ... */],
      currentDragIndex: null,
      draggedIndex: null
    };
  },
  methods: {
    dragStart(index) {
      this.draggedIndex = index;
    },
    dragEnter(index) {
      this.currentDragIndex = index;
    },
    dragEnd() {
      this.currentDragIndex = null;
    },
    drop() {
      if (this.draggedIndex !== this.currentDragIndex) {
        const movedItem = this.items.splice(this.draggedIndex, 1)[0];
        this.items.splice(this.currentDragIndex, 0, movedItem);
      }
    }
  }
};
</script>

<style>
.dragging {
  opacity: 0.5;
  border: 2px dashed #ccc;
}
</style>

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

相关文章

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…

vue登录实现

vue登录实现

Vue 登录实现 实现登录功能通常需要前端与后端配合,Vue 作为前端框架,主要负责表单处理、请求发送和状态管理。以下是常见的实现方式: 表单设计与数据绑定 使用 Vue 的 v-model 实现表…

自实现vue

自实现vue

实现 Vue 的核心功能 要实现一个简化版的 Vue,需要理解其核心功能:数据响应式、模板编译、虚拟 DOM 和组件系统。以下是关键步骤的分解: 数据响应式 Vue 使用 Object.define…

vue 实现协同

vue 实现协同

Vue 实现协同编辑的方案 协同编辑指多个用户同时编辑同一文档并实时同步更改。Vue 结合相关库和技术可轻松实现该功能。 使用 WebSocket 实现实时通信 WebSocket 提供全双工通信,…