当前位置:首页 > VUE

Vue实现拖拽布局

2026-01-16 22:59:56VUE

Vue 实现拖拽布局的方法

使用 HTML5 原生拖拽 API

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

<template>
  <div 
    v-for="(item, index) in items" 
    :key="index"
    draggable="true"
    @dragstart="handleDragStart(index, $event)"
    @dragover.prevent
    @drop="handleDrop(index, $event)"
  >
    {{ item }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      draggedIndex: null
    };
  },
  methods: {
    handleDragStart(index, event) {
      this.draggedIndex = index;
      event.dataTransfer.setData('text/plain', index);
    },
    handleDrop(index, event) {
      const draggedIndex = this.draggedIndex;
      if (draggedIndex !== null) {
        const newItems = [...this.items];
        const [removed] = newItems.splice(draggedIndex, 1);
        newItems.splice(index, 0, removed);
        this.items = newItems;
      }
    }
  }
};
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更简单的拖拽实现方式。

安装依赖:

npm install vuedraggable

示例代码:

<template>
  <draggable v-model="items" @end="onDragEnd">
    <div v-for="(item, index) in items" :key="index">
      {{ item }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3']
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成', this.items);
    }
  }
};
</script>

实现网格拖拽布局

对于网格布局的拖拽,可以使用 vue-grid-layout 库。

安装依赖:

npm install vue-grid-layout

示例代码:

<template>
  <grid-layout
    :layout="layout"
    :col-num="12"
    :row-height="30"
    @layout-updated="layoutUpdated"
  >
    <grid-item
      v-for="item in layout"
      :key="item.i"
      :x="item.x"
      :y="item.y"
      :w="item.w"
      :h="item.h"
      :i="item.i"
    >
      {{ item.i }}
    </grid-item>
  </grid-layout>
</template>

<script>
import { GridLayout, GridItem } from 'vue-grid-layout';

export default {
  components: { GridLayout, GridItem },
  data() {
    return {
      layout: [
        { x: 0, y: 0, w: 2, h: 2, i: '0' },
        { x: 2, y: 0, w: 2, h: 2, i: '1' },
        { x: 4, y: 0, w: 2, h: 2, i: '2' }
      ]
    };
  },
  methods: {
    layoutUpdated(newLayout) {
      this.layout = newLayout;
    }
  }
};
</script>

自定义拖拽逻辑

如果需要更复杂的拖拽逻辑,可以结合 Vue 的响应式数据和事件系统实现自定义拖拽。

Vue实现拖拽布局

<template>
  <div class="container">
    <div
      v-for="(item, index) in items"
      :key="index"
      class="draggable-item"
      :style="{ left: item.x + 'px', top: item.y + 'px' }"
      @mousedown="startDrag(index, $event)"
      @mousemove="onDrag($event)"
      @mouseup="stopDrag"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { text: 'Item 1', x: 0, y: 0 },
        { text: 'Item 2', x: 100, y: 0 },
        { text: 'Item 3', x: 200, y: 0 }
      ],
      dragging: false,
      currentIndex: null,
      startX: 0,
      startY: 0
    };
  },
  methods: {
    startDrag(index, event) {
      this.dragging = true;
      this.currentIndex = index;
      this.startX = event.clientX - this.items[index].x;
      this.startY = event.clientY - this.items[index].y;
    },
    onDrag(event) {
      if (this.dragging) {
        const newItems = [...this.items];
        newItems[this.currentIndex].x = event.clientX - this.startX;
        newItems[this.currentIndex].y = event.clientY - this.startY;
        this.items = newItems;
      }
    },
    stopDrag() {
      this.dragging = false;
    }
  }
};
</script>

<style>
.container {
  position: relative;
  width: 100%;
  height: 300px;
  border: 1px solid #ccc;
}
.draggable-item {
  position: absolute;
  width: 100px;
  height: 50px;
  background: #eee;
  border: 1px solid #999;
  cursor: move;
}
</style>

以上方法可以根据需求选择适合的方案实现拖拽布局,从简单的列表拖拽到复杂的网格布局均可覆盖。

标签: 布局拖拽
分享给朋友:

相关文章

vue实现拖拽替换

vue实现拖拽替换

实现拖拽替换的基本思路 使用HTML5的拖放API结合Vue的响应式数据绑定,可以轻松实现元素的拖拽替换功能。核心是利用draggable属性、dragstart、dragover和drop事件。…

vue原生实现拖拽

vue原生实现拖拽

Vue 原生实现拖拽功能 在 Vue 中实现拖拽功能可以通过 HTML5 的拖拽 API 结合 Vue 的事件绑定和数据响应式特性来完成。以下是几种常见的实现方式: 使用 HTML5 拖拽 API…

vue实现导航拖拽

vue实现导航拖拽

Vue 实现导航拖拽功能 在 Vue 中实现导航拖拽功能,可以通过原生 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种方法的详细实现步骤: 使用 HTML5…

vue布局组件实现

vue布局组件实现

Vue 布局组件实现方法 基础布局组件设计 使用 Vue 的单文件组件(SFC)创建一个基础的布局组件框架,通常包含<header>、<main>、<footer>…

vue拖拽布局实现方案

vue拖拽布局实现方案

Vue 拖拽布局实现方案 使用第三方库(推荐) Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,适用于列表拖拽排序和布局调整。安装后可直接在模板中使用,支持跨列表拖拽…

vue实现列拖拽功能

vue实现列拖拽功能

实现列拖拽功能的方法 在Vue中实现列拖拽功能,可以通过以下几种方式实现,具体选择取决于项目需求和技术栈。 使用HTML5原生拖拽API HTML5提供了原生的拖拽API,可以通过dragg…