当前位置:首页 > VUE

vue 实现拖拽功能

2026-01-17 00:01:10VUE

Vue 实现拖拽功能的方法

使用 HTML5 原生拖拽 API

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

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragover.prevent
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

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

使用 Vue.Draggable 库

Vue.Draggable 是一个基于 Sortable.js 的 Vue 拖拽组件,适用于列表拖拽排序等场景。

安装依赖:

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('拖拽结束');
    }
  }
};
</script>

自定义拖拽指令

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

vue 实现拖拽功能

<template>
  <div v-draggable>可拖拽元素</div>
</template>

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

        el.addEventListener('dragstart', (e) => {
          e.dataTransfer.setData('text/plain', el.id);
        });
      }
    }
  }
};
</script>

拖拽限制与边界控制

添加边界检查和拖拽范围限制。

methods: {
  handleDragOver(e) {
    const rect = e.target.getBoundingClientRect();
    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;

    // 限制在容器内拖拽
    if (x < 0 || y < 0 || x > rect.width || y > rect.height) {
      return false;
    }
    e.target.style.left = `${x}px`;
    e.target.style.top = `${y}px`;
  }
}

拖拽数据同步

在拖拽过程中实时更新 Vue 数据模型。

data() {
  return {
    items: [],
    draggedItem: null
  };
},
methods: {
  handleDragStart(item) {
    this.draggedItem = item;
  },
  handleDrop(targetIndex) {
    if (this.draggedItem) {
      const draggedIndex = this.items.indexOf(this.draggedItem);
      this.items.splice(targetIndex, 0, this.items.splice(draggedIndex, 1)[0]);
    }
  }
}

以上方法可根据具体需求选择使用,HTML5 原生 API 适合简单场景,Vue.Draggable 适合列表排序,自定义指令则提供最大灵活性。

标签: 拖拽功能
分享给朋友:

相关文章

vue编辑功能怎么实现

vue编辑功能怎么实现

Vue 编辑功能的实现方法 1. 数据绑定与表单处理 使用 v-model 实现双向数据绑定,将表单输入与 Vue 实例的数据属性关联。例如: <template> <inp…

vue实现拖拽

vue实现拖拽

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

vue实现功能

vue实现功能

Vue 实现功能的方法 Vue.js 是一个流行的前端框架,用于构建用户界面。以下是几种常见的功能实现方法: 数据绑定 Vue 提供了双向数据绑定,可以通过 v-model 指令实现表单输入和应用状…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

php实现留言板功能

php实现留言板功能

PHP 留言板功能实现 数据库设计 创建数据库表 messages,包含以下字段: id:自增主键 name:留言者姓名(VARCHAR) email:留言者邮箱(VARCHAR) content:…

uniapp实现支付功能

uniapp实现支付功能

支付功能实现概述 在UniApp中实现支付功能通常需要对接第三方支付平台(如微信支付、支付宝支付等)。以下是基于微信支付和支付宝支付的通用实现流程。 微信支付实现步骤 1. 配置支付权限 在微信开放…