当前位置:首页 > 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实现login

vue实现login

Vue 实现登录功能 在 Vue 中实现登录功能通常需要以下几个步骤: 创建登录表单组件 在 Vue 项目中创建一个登录表单组件,包含用户名和密码输入框以及提交按钮。可以使用 Vue 的模板语法和双…

用vue实现echarts

用vue实现echarts

使用 Vue 实现 ECharts 安装依赖 在 Vue 项目中安装 ECharts 和 Vue-ECharts(官方推荐的 Vue 封装库): npm install echarts vue-ec…

vue实现树目录

vue实现树目录

Vue 实现树形目录 在 Vue 中实现树形目录可以通过递归组件或第三方库(如 element-ui 的 el-tree)完成。以下是两种常见实现方式: 递归组件实现 递归组件适合自定义程度高的树形…

实现vue模板解析

实现vue模板解析

Vue 模板解析的基本原理 Vue 的模板解析是将模板字符串转换为渲染函数的过程。核心步骤包括模板编译、AST 生成、优化和代码生成。 模板编译阶段 Vue 使用 vue-template-comp…

vue如何实现分离

vue如何实现分离

Vue 实现组件分离的方法 Vue 可以通过多种方式实现组件分离,提升代码的可维护性和复用性。以下是几种常见的方法: 单文件组件 (SFC) Vue 的单文件组件(.vue 文件)将模板、脚本和样式…

分页用vue实现

分页用vue实现

分页用 Vue 实现 在 Vue 中实现分页功能通常需要结合数据管理和 UI 组件。以下是几种常见的方法: 使用 Vue 组件库的分页组件 许多 Vue UI 组件库(如 Element UI、Va…