当前位置:首页 > VUE

vue实现拖拽组件

2026-03-10 01:47:24VUE

Vue 拖拽组件实现方法

使用 HTML5 原生拖拽 API

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

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  >
    可拖拽元素
  </div>
  <div 
    @dragover.prevent
    @drop="handleDrop"
  >
    放置区域
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', 'drag-data')
    },
    handleDrop(e) {
      const data = e.dataTransfer.getData('text/plain')
      console.log('接收到的数据:', data)
    }
  }
}
</script>

使用第三方库 vue-draggable

vue-draggable 是基于 Sortable.js 的 Vue 拖拽组件库,适合列表排序等场景。

安装依赖:

npm install vuedraggable

基本用法:

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

<script>
import draggable from 'vuedraggable'

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    }
  },
  methods: {
    onDragEnd() {
      console.log('排序后的列表:', this.list)
    }
  }
}
</script>

自定义拖拽指令

通过 Vue 自定义指令实现更灵活的拖拽控制。

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

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

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

使用方式:

<div v-drag="'drag-data'">拖拽我</div>

拖拽排序与动画

结合 Vue 的过渡系统实现拖拽动画效果。

<template>
  <draggable v-model="items" tag="ul">
    <transition-group name="list">
      <li v-for="item in items" :key="item.id">
        {{ item.text }}
      </li>
    </transition-group>
  </draggable>
</template>

<style>
.list-move {
  transition: transform 0.3s ease;
}
</style>

跨组件拖拽

使用事件总线或 Vuex 实现跨组件拖拽数据传递。

// 事件总线方式
const bus = new Vue()

// 拖拽源组件
bus.$emit('drag-start', dragData)

// 放置目标组件
bus.$on('drag-start', (data) => {
  this.dragData = data
})

性能优化建议

对于大型列表,使用虚拟滚动技术避免渲染所有元素

<draggable v-model="list" :options="{ animation: 150 }">
  <div v-for="item in list" :key="item.id">
    {{ item.name }}
  </div>
</draggable>

移动端适配

添加 touch 事件支持以实现移动端拖拽

vue实现拖拽组件

el.addEventListener('touchstart', handleTouchStart)
el.addEventListener('touchmove', handleTouchMove)
el.addEventListener('touchend', handleTouchEnd)

注意事项

  • 拖拽操作需要考虑数据同步问题
  • 复杂场景建议使用专业拖拽库如 interact.js
  • 移动端需额外处理 touch 事件
  • 无障碍访问需添加 ARIA 属性

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

相关文章

vue实现广告组件

vue实现广告组件

Vue 实现广告组件的核心方法 数据驱动的广告内容渲染 通过 props 接收广告数据(如图片URL、跳转链接等),使用 v-bind 动态绑定属性。典型结构包含 <a> 标签嵌套 <…

vue组件传值实现分页

vue组件传值实现分页

Vue组件传值实现分页的方法 在Vue中实现分页功能,通常需要父子组件之间的数据传递。以下是几种常见的传值方式: 使用props传递数据 父组件通过props向子组件传递当前页码和总页数等分页信息:…

vue内实现拖拽

vue内实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template>…

react组件如何通讯

react组件如何通讯

React 组件通讯方式 React 组件间的通讯方式主要包括以下几种方法,适用于不同场景下的数据传递和状态管理需求。 父子组件通讯(Props 传递) 父组件通过 props 向子组件传递数据或回…

如何缓存react组件

如何缓存react组件

缓存React组件的方法 React.memo 使用React.memo对函数组件进行浅比较缓存,避免不必要的重新渲染。适用于props不变的场景。 const MemoizedComponen…

利用vue实现拖拽

利用vue实现拖拽

使用 Vue 实现拖拽功能 原生 HTML5 拖拽 API Vue 可以结合 HTML5 的拖拽 API 实现基础拖拽功能。以下是一个简单示例: <template> <div…