当前位置:首页 > VUE

vue实现drag

2026-03-07 00:47:34VUE

Vue 实现拖拽功能的方法

使用 HTML5 原生拖拽 API

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

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

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

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,可以轻松实现列表的拖拽排序功能。

vue实现drag

安装 Vue.Draggable:

npm install vuedraggable

使用示例:

vue实现drag

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

<script>
import draggable from 'vuedraggable';

export default {
  components: {
    draggable
  },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽结束,当前列表:', this.list);
    }
  }
};
</script>

自定义拖拽实现

如果需要更灵活的拖拽功能,可以通过监听鼠标事件(mousedownmousemovemouseup)来自定义拖拽逻辑。

<template>
  <div>
    <div 
      ref="draggable"
      class="draggable-item"
      @mousedown="startDrag"
    >
      自定义拖拽元素
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(e) {
      if (!this.isDragging) return;
      this.offsetX = e.clientX - this.startX;
      this.offsetY = e.clientY - this.startY;
      this.$refs.draggable.style.transform = `translate(${this.offsetX}px, ${this.offsetY}px)`;
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
};
</script>

<style>
.draggable-item {
  width: 100px;
  height: 100px;
  background: #42b983;
  cursor: move;
}
</style>

使用 Vue 指令实现拖拽

可以通过自定义指令封装拖拽逻辑,方便在多个组件中复用。

<template>
  <div v-draggable class="draggable-item">拖拽指令实现</div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.style.position = 'absolute';
        el.style.cursor = 'move';

        let startX = 0;
        let startY = 0;
        let offsetX = 0;
        let offsetY = 0;

        el.addEventListener('mousedown', (e) => {
          startX = e.clientX;
          startY = e.clientY;
          document.addEventListener('mousemove', onDrag);
          document.addEventListener('mouseup', stopDrag);
        });

        function onDrag(e) {
          offsetX = e.clientX - startX;
          offsetY = e.clientY - startY;
          el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
        }

        function stopDrag() {
          document.removeEventListener('mousemove', onDrag);
          document.removeEventListener('mouseup', stopDrag);
        }
      }
    }
  }
};
</script>

<style>
.draggable-item {
  width: 100px;
  height: 100px;
  background: #ff6b6b;
}
</style>

注意事项

  • 拖拽性能优化:对于大量元素的拖拽,需注意性能问题,避免频繁的 DOM 操作。
  • 移动端适配:如果需要支持移动端,需处理 touchstarttouchmovetouchend 事件。
  • 拖拽边界:可添加边界检查逻辑,限制拖拽范围。

标签: vuedrag
分享给朋友:

相关文章

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变量…

vue实现tab

vue实现tab

Vue 实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 和 v-show 指令 通过绑定 v-if 或 v-show 来…

使用vue实现搜索

使用vue实现搜索

使用 Vue 实现搜索功能 基础搜索实现 在 Vue 中实现搜索功能通常涉及数据绑定、事件监听和列表过滤。以下是一个简单的实现方式: <template> <div&g…

vue实现登录认证

vue实现登录认证

Vue 登录认证实现方法 使用 Vue Router 和 Vuex 管理登录状态 在 Vue 项目中,通常使用 Vue Router 进行路由管理,Vuex 进行状态管理。登录认证的核心是验证用户身份…

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备 准备需要筛选的数据源,通常是一个数组,可以存储在Vue组件的…