当前位置:首页 > VUE

vue实现菜单拖拽

2026-01-19 09:32:07VUE

Vue 实现菜单拖拽

实现菜单拖拽功能可以通过 Vue 的指令或第三方库(如 vuedraggable)来完成。以下是两种常见的方法:

使用 vuedraggable 库

vuedraggable 是基于 Sortable.js 的 Vue 拖拽组件,适合实现列表或菜单的拖拽排序。

安装依赖:

vue实现菜单拖拽

npm install vuedraggable

示例代码:

<template>
  <draggable v-model="menuItems" @end="onDragEnd">
    <div v-for="item in menuItems" :key="item.id">
      {{ item.name }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      menuItems: [
        { id: 1, name: '菜单项1' },
        { id: 2, name: '菜单项2' },
        { id: 3, name: '菜单项3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成后的顺序:', this.menuItems);
    }
  }
};
</script>

使用原生 HTML5 拖拽 API

如果不想依赖第三方库,可以使用 HTML5 的拖拽 API 结合 Vue 实现。

vue实现菜单拖拽

示例代码:

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

<script>
export default {
  data() {
    return {
      menuItems: [
        { id: 1, name: '菜单项1' },
        { id: 2, name: '菜单项2' },
        { id: 3, name: '菜单项3' }
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.effectAllowed = 'move';
    },
    handleDrop(event, targetItem) {
      if (this.draggedItem === targetItem) return;

      const draggedIndex = this.menuItems.indexOf(this.draggedItem);
      const targetIndex = this.menuItems.indexOf(targetItem);

      this.menuItems.splice(draggedIndex, 1);
      this.menuItems.splice(targetIndex, 0, this.draggedItem);
    }
  }
};
</script>

注意事项

  • 使用 vuedraggable 时,确保 v-model 绑定的数据是响应式的(如数组)。
  • 原生拖拽 API 需要处理 dragover 事件并调用 preventDefault() 以允许放置。
  • 拖拽完成后,可以触发回调函数(如 @end)进行数据持久化或其他操作。

扩展功能

如果需要更复杂的交互(如限制拖拽范围或嵌套拖拽),可以结合 Sortable.js 的配置选项或自定义逻辑实现。例如,限制只能在特定容器内拖拽:

// vuedraggable 的配置
<draggable v-model="menuItems" :options="{ group: 'menu', animation: 150 }">

以上方法可以根据实际需求灵活调整,适用于大多数菜单拖拽场景。

标签: 拖拽菜单
分享给朋友:

相关文章

拖拽式编程vue实现

拖拽式编程vue实现

拖拽式编程在 Vue 中的实现方法 使用 HTML5 原生拖放 API Vue 可以结合 HTML5 的拖放 API 实现基础拖拽功能。通过 draggable 属性标记可拖拽元素,监听 dragst…

vue拖拽实现

vue拖拽实现

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

css制作下拉菜单

css制作下拉菜单

CSS 制作下拉菜单的方法 使用纯 CSS 可以创建简单的下拉菜单效果,主要依赖 :hover 伪类和 display 属性控制子菜单的显示与隐藏。 基础 HTML 结构 <div c…

纯css制作tab菜单

纯css制作tab菜单

纯CSS制作Tab菜单的方法 使用radio input控制切换 通过<input type="radio">和<label>元素配合实现无JavaScript的Tab切换效果…

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单调用的方法 使用路由配置生成菜单 在 Vue 项目中,可以通过路由配置自动生成菜单结构。路由配置通常包含 path、name、meta 等信息,这些信息可用于构建菜单项。 //…

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽改变尺寸。创建一个可拖拽的边界元素,调整目标元素的…