当前位置:首页 > 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 Router 中配置动态路由参数,通过 $route.params 获取详情 ID。示例路由配置: { path: '/detail/:i…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的Ca…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue 简单实现

vue 简单实现

以下是 Vue 的简单实现示例,涵盖基础模板、数据绑定、方法及生命周期: 基础模板与数据绑定 <div id="app"> <p>{{ message }}</…

vue 实现折叠

vue 实现折叠

Vue 实现折叠功能的方法 在 Vue 中实现折叠功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 或 v-show 控制显示隐藏 通过绑定一个布尔值变量,结合 v-if 或 v…

vue实现hexo

vue实现hexo

Vue 集成 Hexo 的实现方法 Hexo 是一个静态博客框架,而 Vue 是一个前端框架。将 Vue 集成到 Hexo 中可以通过以下方式实现: 在 Hexo 中使用 Vue 组件 通过 Hex…