当前位置:首页 > VUE

拖拽式编程vue实现

2026-02-25 19:07:30VUE

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

使用第三方库(如 vuedraggable

安装 vuedraggable 库:

npm install vuedraggable

在 Vue 组件中引入并使用:

拖拽式编程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 属性和事件实现基础拖拽功能:

拖拽式编程vue实现

<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 管理拖拽状态
  • 性能优化:对于大量数据使用虚拟滚动

进阶功能示例

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

<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 实现静态查询 在 Vue 中实现静态查询通常指不依赖后端接口,直接在前端处理数据筛选或搜索功能。以下是几种常见实现方式: 使用计算属性过滤数据 通过计算属性对静态数据进行筛选,适合简单查询…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transi…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── K…

vue jwt实现

vue jwt实现

Vue JWT 实现方法 安装依赖 确保项目中安装了 jsonwebtoken(后端)和 axios(前端)。若使用 Vue 3,可搭配 vue-router 和 pinia(或 vuex)管理状态。…

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click…

vue实现门户

vue实现门户

Vue 实现门户网站的关键步骤 搭建基础框架 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理多页面路由。门户通常需要响应式布局,可引入 UI 库如 Element P…