当前位置:首页 > VUE

vue实现树形拖拽

2026-02-18 15:42:20VUE

Vue 实现树形拖拽功能

使用 vue-draggable

安装 vue-draggable 库:

npm install vuedraggable

在组件中引入并使用:

vue实现树形拖拽

<template>
  <draggable
    v-model="treeData"
    group="tree"
    @end="onDragEnd"
    :animation="200"
  >
    <div v-for="item in treeData" :key="item.id">
      {{ item.name }}
      <draggable
        v-if="item.children"
        v-model="item.children"
        group="tree"
        @end="onDragEnd"
      >
        <div v-for="child in item.children" :key="child.id">
          {{ child.name }}
        </div>
      </draggable>
    </div>
  </draggable>
</template>

<script>
import draggable from "vuedraggable";

export default {
  components: { draggable },
  data() {
    return {
      treeData: [
        { id: 1, name: "Node 1", children: [
          { id: 2, name: "Node 1.1" },
          { id: 3, name: "Node 1.2" }
        ]},
        { id: 4, name: "Node 2" }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log("拖拽完成", this.treeData);
    }
  }
};
</script>

使用 element-ui 的树形拖拽

安装 element-ui

vue实现树形拖拽

npm install element-ui

实现树形拖拽:

<template>
  <el-tree
    :data="treeData"
    draggable
    @node-drop="handleDrop"
    :allow-drop="allowDrop"
  ></el-tree>
</template>

<script>
export default {
  data() {
    return {
      treeData: [
        { id: 1, label: "Node 1", children: [
          { id: 2, label: "Node 1.1" },
          { id: 3, label: "Node 1.2" }
        ]},
        { id: 4, label: "Node 2" }
      ]
    };
  },
  methods: {
    handleDrop(draggingNode, dropNode, type) {
      console.log("拖拽完成", this.treeData);
    },
    allowDrop(draggingNode, dropNode, type) {
      return type !== "inner" || dropNode.level < 3;
    }
  }
};
</script>

自定义实现树形拖拽

通过原生 HTML5 拖拽 API 实现:

<template>
  <div
    v-for="item in treeData"
    :key="item.id"
    draggable
    @dragstart="handleDragStart($event, item)"
    @dragover="handleDragOver($event, item)"
    @drop="handleDrop($event, item)"
  >
    {{ item.name }}
    <div
      v-if="item.children"
      v-for="child in item.children"
      :key="child.id"
      draggable
      @dragstart="handleDragStart($event, child)"
      @dragover="handleDragOver($event, child)"
      @drop="handleDrop($event, child)"
    >
      {{ child.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      treeData: [
        { id: 1, name: "Node 1", children: [
          { id: 2, name: "Node 1.1" },
          { id: 3, name: "Node 1.2" }
        ]},
        { id: 4, name: "Node 2" }
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(e, item) {
      this.draggedItem = item;
      e.dataTransfer.setData("text/plain", "");
    },
    handleDragOver(e, item) {
      e.preventDefault();
    },
    handleDrop(e, item) {
      e.preventDefault();
      if (this.draggedItem === item) return;

      // 实现拖拽逻辑
      console.log("拖拽完成", this.draggedItem, item);
    }
  }
};
</script>

注意事项

  • 使用第三方库(如 vue-draggableelement-ui)可以快速实现拖拽功能,但可能需要调整样式或逻辑。
  • 自定义实现灵活性更高,但需要处理更多细节(如父子节点关系、拖拽限制等)。
  • 拖拽后需要更新数据状态,确保视图与数据同步。

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

相关文章

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vu…

vue实现必填

vue实现必填

Vue 实现表单必填验证的方法 在Vue中实现表单必填验证可以通过多种方式完成,以下是几种常见的方法: 使用HTML5原生属性 最简单的必填验证可以通过HTML5的required属性实现: &l…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…

vue cli 实现

vue cli 实现

Vue CLI 实现步骤 安装 Vue CLI 确保 Node.js 版本在 8.9 或以上。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 创建新项目…

node vue实现

node vue实现

Node.js 与 Vue.js 实现方案 环境搭建 安装 Node.js(建议 LTS 版本),通过 npm 或 yarn 初始化项目。Vue.js 可通过 Vue CLI 快速搭建: npm…