当前位置:首页 > 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 HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

vue实现拖拽实现布局

vue实现拖拽实现布局

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

vue滚动插件实现

vue滚动插件实现

vue滚动插件实现方法 使用vue-virtual-scroller 安装依赖包: npm install vue-virtual-scroller 注册组件: import VueVirtual…

vue插件实现联动

vue插件实现联动

Vue 插件实现联动的方法 使用全局事件总线 在 Vue 中可以通过创建一个全局事件总线来实现组件间的联动。首先创建一个新的 Vue 实例作为事件总线。 // event-bus.js import…

uniapp 路由插件

uniapp 路由插件

在UniApp中,路由管理通常依赖框架内置的页面跳转API,但若需要更高级的路由功能(如动态路由、拦截器等),可通过以下插件或方案实现: 路由插件推荐 uni-simple-router 专为Uni…

vue实现插件化

vue实现插件化

Vue 插件化实现方法 Vue 插件化允许开发者扩展 Vue 的核心功能,通过封装可复用的逻辑或全局功能来提升开发效率。以下是实现 Vue 插件化的核心方法: 插件的基本结构 Vue 插件需要暴露一…