当前位置:首页 > VUE

vue实现拆分拖拽

2026-03-29 16:46:29VUE

Vue 实现拆分拖拽功能

拆分拖拽通常指将页面元素拆分为多个可拖拽的部分,并能独立控制它们的拖拽行为。以下是基于 Vue 的实现方法:

使用 Vue.Draggable 库

Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合实现列表拖拽和拆分拖拽功能。

安装依赖:

npm install vuedraggable

基础示例代码:

<template>
  <div>
    <draggable 
      v-model="list1" 
      group="items" 
      @start="dragStart" 
      @end="dragEnd"
    >
      <div v-for="item in list1" :key="item.id">{{ item.name }}</div>
    </draggable>

    <draggable 
      v-model="list2" 
      group="items" 
      @start="dragStart" 
      @end="dragEnd"
    >
      <div v-for="item in list2" :key="item.id">{{ item.name }}</div>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: { draggable },
  data() {
    return {
      list1: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ],
      list2: [
        { id: 3, name: 'Item 3' },
        { id: 4, name: 'Item 4' }
      ]
    }
  },
  methods: {
    dragStart() {
      console.log('Drag started')
    },
    dragEnd() {
      console.log('Drag ended')
    }
  }
}
</script>

自定义拖拽实现

如果需要更精细的控制,可以使用原生 HTML5 拖拽 API:

<template>
  <div>
    <div 
      v-for="item in items" 
      :key="item.id"
      draggable="true"
      @dragstart="handleDragStart($event, item)"
      @dragend="handleDragEnd"
    >
      {{ item.name }}
    </div>

    <div 
      class="drop-zone"
      @dragover.prevent
      @drop="handleDrop"
    >
      拖拽到这里
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ],
      draggedItem: null
    }
  },
  methods: {
    handleDragStart(e, item) {
      this.draggedItem = item
      e.dataTransfer.effectAllowed = 'move'
    },
    handleDragEnd() {
      this.draggedItem = null
    },
    handleDrop(e) {
      if (this.draggedItem) {
        // 处理拖拽后的逻辑
        console.log('Dropped:', this.draggedItem)
      }
    }
  }
}
</script>

<style>
.drop-zone {
  border: 2px dashed #ccc;
  padding: 20px;
  margin-top: 20px;
}
</style>

复杂布局拆分拖拽

对于更复杂的布局拆分(如面板分割),可以使用第三方库如 Split.js:

安装 Split.js:

npm install split.js

示例实现:

vue实现拆分拖拽

<template>
  <div class="split-container">
    <div id="left-panel">左侧面板</div>
    <div id="right-panel">右侧面板</div>
  </div>
</template>

<script>
import Split from 'split.js'

export default {
  mounted() {
    Split(['#left-panel', '#right-panel'], {
      sizes: [50, 50],
      minSize: 100,
      gutterSize: 8,
      cursor: 'col-resize'
    })
  }
}
</script>

<style>
.split-container {
  display: flex;
  height: 100vh;
}

#left-panel, #right-panel {
  background: #f0f0f0;
  overflow: auto;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
}
</style>

以上方法可以根据具体需求选择使用,Vue.Draggable 适合列表项拖拽,原生 API 提供更基础的控制,而 Split.js 则适合面板分割拖拽场景。

标签: 拖拽vue
分享给朋友:

相关文章

实现vue组件

实现vue组件

Vue 组件的基本实现 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种方式: 单文件组件 (SFC) 使用 .vue 文件格式,…

vue实现suspense

vue实现suspense

Vue 3 中实现 Suspense Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue 实现打印

vue 实现打印

Vue 实现打印功能的方法 在Vue项目中实现打印功能,可以通过以下几种方式实现: 使用window.print()方法 通过调用浏览器的原生打印API实现基础打印功能,适用于简单内容打印。 //…

vue 实现href

vue 实现href

Vue 实现 href 的方法 在 Vue 中实现 href 功能可以通过多种方式,具体取决于需求场景。以下是几种常见的方法: 使用 <a> 标签 直接使用 HTML 的 <a&g…

vue 实现流程

vue 实现流程

Vue 实现流程 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 实现的基本流程: 安装 Vue.js 通过 CDN 引入或使用 npm/yarn 安装:…