当前位置:首页 > VUE

vue 实现拖拽插件

2026-01-17 02:57:35VUE

Vue 拖拽插件实现方法

使用原生 HTML5 拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以直接使用这些 API。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    @dragover="handleDragOver"
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id)
    },
    handleDragOver(e) {
      e.preventDefault()
    },
    handleDrop(e) {
      e.preventDefault()
      const data = e.dataTransfer.getData('text/plain')
      const draggableElement = document.getElementById(data)
      e.target.appendChild(draggableElement)
    }
  }
}
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 拖拽组件,提供了更高级的功能和更好的兼容性。

安装:

npm install vuedraggable

基本用法:

vue 实现拖拽插件

<template>
  <draggable v-model="myArray" group="people" @start="drag=true" @end="drag=false">
    <div v-for="element in myArray" :key="element.id">
      {{ element.name }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: {
    draggable
  },
  data() {
    return {
      myArray: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    }
  }
}
</script>

自定义拖拽指令

可以创建自定义指令来实现更灵活的拖拽功能。

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.4'
    })

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

使用指令:

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

拖拽排序实现

结合 Vue 的响应式特性,可以实现列表的拖拽排序。

vue 实现拖拽插件

<template>
  <ul>
    <li 
      v-for="(item, index) in list" 
      :key="item.id"
      draggable="true"
      @dragstart="dragStart(index)"
      @dragover.prevent="dragOver(index)"
      @drop="drop(index)"
    >
      {{ item.text }}
    </li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' }
      ],
      draggedIndex: null
    }
  },
  methods: {
    dragStart(index) {
      this.draggedIndex = index
    },
    dragOver(index) {
      if (this.draggedIndex !== index) {
        const draggedItem = this.list[this.draggedIndex]
        this.list.splice(this.draggedIndex, 1)
        this.list.splice(index, 0, draggedItem)
        this.draggedIndex = index
      }
    },
    drop() {
      this.draggedIndex = null
    }
  }
}
</script>

跨组件拖拽实现

使用事件总线或 Vuex 可以实现跨组件的拖拽功能。

// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()

拖出组件:

<template>
  <div 
    draggable="true"
    @dragstart="dragStart"
  >
    拖拽我
  </div>
</template>

<script>
import { EventBus } from './event-bus'
export default {
  methods: {
    dragStart(e) {
      EventBus.$emit('drag-start', { data: this.itemData })
    }
  }
}
</script>

放入组件:

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

<script>
import { EventBus } from './event-bus'
export default {
  created() {
    EventBus.$on('drag-start', (data) => {
      this.draggedData = data
    })
  },
  methods: {
    handleDrop() {
      if (this.draggedData) {
        // 处理放入逻辑
      }
    }
  }
}
</script>

以上方法提供了从简单到复杂的多种拖拽实现方案,可以根据项目需求选择合适的实现方式。对于大多数应用场景,推荐使用 Vue.Draggable 组件,它提供了丰富的功能和良好的兼容性。

标签: 插件拖拽
分享给朋友:

相关文章

vue拖拽实现

vue拖拽实现

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现功能插件

vue实现功能插件

Vue 插件实现方法 Vue 插件通常用于封装全局功能(如指令、过滤器、混入等),以下是实现 Vue 插件的典型方式: 插件基本结构 const MyPlugin = { instal…

vue 实现卡片拖拽

vue 实现卡片拖拽

Vue 实现卡片拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template…

jquery插件

jquery插件

jQuery 插件开发指南 jQuery 插件是一种扩展 jQuery 功能的模块化方式,允许开发者封装可重用的代码。以下是开发和使用 jQuery 插件的基本方法。 插件基本结构 jQuery 插…

vue实现拖拽实现布局

vue实现拖拽实现布局

Vue 实现拖拽布局的方法 使用 Vue.Draggable 库 Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合实现列表或网格的拖拽排序。 安装依赖: npm…