当前位置:首页 > 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 的响应式数据和事件系统实现自定义拖拽。

<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 实现卡片拖拽

vue 实现卡片拖拽

Vue 实现卡片拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

vue实现模块拖拽

vue实现模块拖拽

Vue 实现模块拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dro…

vue实现商品布局

vue实现商品布局

使用 Vue 实现商品布局 数据准备 商品数据通常存储在数组中,每个商品对象包含名称、价格、图片等属性。示例数据结构如下: data() { return { products: […

vue实现拖拽到容器里

vue实现拖拽到容器里

实现拖拽到容器的基本步骤 安装并引入 Vue.Draggable 库,这是一个基于 Sortable.js 的 Vue 拖拽组件。可以通过 npm 或 yarn 进行安装。 npm install…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 drag…

vue拖拽实现

vue拖拽实现

vue拖拽实现方法 使用HTML5原生拖拽API HTML5提供原生拖拽API,通过draggable属性、dragstart、dragend等事件实现基础拖拽功能。 <template&g…