当前位置:首页 > VUE

vue 实现拖拽插件

2026-03-09 07:58:05VUE

实现拖拽插件的方法

使用HTML5原生拖拽API

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

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

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', '拖拽数据');
    },
    handleDragOver(e) {
      e.preventDefault();
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      console.log('接收到的数据:', data);
    },
    handleDragEnd() {
      console.log('拖拽结束');
    }
  }
}
</script>

使用第三方库Vue.Draggable

Vue.Draggable是基于Sortable.js的Vue拖拽组件,支持列表排序、跨列表拖拽等功能。

安装依赖:

npm install vuedraggable

使用示例:

vue 实现拖拽插件

<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自定义指令实现更灵活的拖拽控制,适合需要高度定制的场景。

<template>
  <div v-draggable @drag-start="onDragStart">
    自定义拖拽元素
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el, binding) {
        el.setAttribute('draggable', true);
        el.addEventListener('dragstart', (e) => {
          binding.value && binding.value(e);
          e.dataTransfer.setData('text/plain', el.textContent);
        });
      }
    }
  },
  methods: {
    onDragStart(e) {
      console.log('自定义拖拽开始', e);
    }
  }
}
</script>

拖拽状态管理

使用Vuex或Pinia管理拖拽状态,实现跨组件通信和状态共享。

vue 实现拖拽插件

// store.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    draggedItem: null,
    dropTarget: null
  },
  mutations: {
    setDraggedItem(state, item) {
      state.draggedItem = item;
    },
    setDropTarget(state, target) {
      state.dropTarget = target;
    }
  }
});

在组件中使用:

<template>
  <div 
    draggable 
    @dragstart="dragStart(item)"
    @drop="drop(item)"
  >
    {{ item.name }}
  </div>
</template>

<script>
import { mapMutations } from 'vuex';

export default {
  props: ['item'],
  methods: {
    ...mapMutations(['setDraggedItem', 'setDropTarget']),
    dragStart(item) {
      this.setDraggedItem(item);
    },
    drop(item) {
      this.setDropTarget(item);
      // 执行拖拽逻辑
    }
  }
}
</script>

性能优化建议

对于大量拖拽元素的情况,使用虚拟滚动技术减少DOM操作。结合vue-virtual-scroller等库提升性能。

npm install vue-virtual-scroller

示例:

<template>
  <RecycleScroller
    :items="largeList"
    :item-size="50"
    v-slot="{ item }"
  >
    <draggable>
      {{ item.name }}
    </draggable>
  </RecycleScroller>
</template>

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

相关文章

vue拖拽容器实现

vue拖拽容器实现

实现 Vue 拖拽容器的基本方法 使用 HTML5 原生拖拽 API 通过 draggable 属性和拖拽事件(dragstart、dragend、dragover、drop)实现基础拖拽功能。适用于…

前端实现拖拽功能vue

前端实现拖拽功能vue

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

vue实现拖拽实现布局

vue实现拖拽实现布局

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

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

vue实现拖拽图层

vue实现拖拽图层

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