当前位置:首页 > VUE

vue实现拖拽放置

2026-03-08 10:36:36VUE

Vue 实现拖拽放置功能

使用 HTML5 原生拖放 API

HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstartdragoverdrop 事件实现拖拽放置功能。

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

    <div 
      @dragover.prevent
      @drop="handleDrop"
    >
      放置区域
    </div>
  </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.setData('text/plain', item.id)
    },
    handleDrop(event) {
      event.preventDefault()
      const itemId = event.dataTransfer.getData('text/plain')
      console.log('Dropped item:', this.draggedItem)
    }
  }
}
</script>

使用第三方库 vue-draggable

对于更复杂的拖拽需求,可以使用第三方库如 vue-draggable(基于 Sortable.js)。

安装依赖:

npm install vuedraggable

使用示例:

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

    <draggable 
      v-model="anotherList" 
      group="items"
    >
      <div v-for="item in anotherList" :key="item.id">
        {{ item.name }}
      </div>
    </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' }
      ],
      anotherList: []
    }
  },
  methods: {
    onDragEnd() {
      console.log('Drag ended', this.items)
    }
  }
}
</script>

自定义拖拽指令

对于需要完全自定义的拖拽行为,可以创建 Vue 自定义指令。

Vue.directive('drag', {
  bind(el, binding) {
    el.setAttribute('draggable', true)

    el.addEventListener('dragstart', (e) => {
      e.dataTransfer.setData('text/plain', binding.value)
      el.style.opacity = '0.5'
    })

    el.addEventListener('dragend', () => {
      el.style.opacity = '1'
    })
  }
})

使用示例:

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

    <div 
      @dragover.prevent
      @drop="handleDrop"
    >
      放置区域
    </div>
  </div>
</template>

拖拽放置的性能优化

对于大量元素的拖拽,建议使用虚拟滚动技术或限制拖拽元素的渲染数量。可以使用 vue-virtual-scroller 等库优化性能。

npm install vue-virtual-scroller

示例:

vue实现拖拽放置

<template>
  <RecycleScroller
    class="scroller"
    :items="items"
    :item-size="50"
    key-field="id"
    v-slot="{ item }"
  >
    <div 
      draggable="true"
      @dragstart="handleDragStart($event, item)"
    >
      {{ item.name }}
    </div>
  </RecycleScroller>
</template>

以上方法可以根据具体需求选择使用,HTML5 原生 API 适合简单场景,vue-draggable 适合复杂交互,自定义指令提供最大灵活性。

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

相关文章

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

vue实现fullpage

vue实现fullpage

Vue 实现 FullPage 效果 在 Vue 中实现全屏滚动(FullPage)效果可以通过多种方式完成,以下是几种常见的方法: 使用现有库 vue-fullpage.js 安装 vue-ful…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue 实现href

vue 实现href

Vue 实现 href 的方法 在 Vue 中实现 href 功能可以通过多种方式,具体取决于需求场景。以下是几种常见的方法: 使用 <a> 标签 直接使用 HTML 的 <a&g…

vue实现注册

vue实现注册

Vue 实现注册功能 注册功能通常涉及前端表单、数据验证、与后端 API 的交互等步骤。以下是一个完整的 Vue 实现注册功能的方案。 创建注册表单 使用 Vue 的模板语法创建注册表单,包含用户名…

vue jwt实现

vue jwt实现

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