当前位置:首页 > 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 拖拽组件,适用于列表拖拽排序等场景。

安装依赖:

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 自定义指令实现更灵活的拖拽控制。

<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电影功能实现

Vue电影功能实现 数据获取与展示 使用Axios或Fetch API从电影API获取数据,例如TMDB或豆瓣API。在Vue组件的created或mounted生命周期钩子中发起请求,将返回的电影数…

原生实现vue功能

原生实现vue功能

原生JavaScript实现Vue核心功能 使用原生JavaScript模拟Vue的核心功能需要理解响应式数据绑定、虚拟DOM和组件系统等概念。以下是关键实现方法: 响应式数据系统 通过Object…

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或…

vue拖拽容器实现

vue拖拽容器实现

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

vue实现答题功能

vue实现答题功能

Vue实现答题功能的基本思路 在Vue中实现答题功能通常需要以下几个核心模块:题目数据管理、用户交互处理、答题状态跟踪和结果计算。通过组件化开发可以更好地组织代码结构。 数据结构设计 答题功能的基础…

vue修改功能实现

vue修改功能实现

Vue 修改功能的实现方法 在 Vue 中实现修改功能通常涉及表单绑定、数据更新和事件处理。以下是几种常见的实现方式: 数据双向绑定 使用 v-model 指令实现表单元素与 Vue 实例数据的双…