当前位置:首页 > VUE

vue实现树形拖拽

2026-02-18 15:42:20VUE

Vue 实现树形拖拽功能

使用 vue-draggable

安装 vue-draggable 库:

npm install vuedraggable

在组件中引入并使用:

<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

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 实现:

vue实现树形拖拽

<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中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(如…

vue实现sso

vue实现sso

Vue 实现 SSO(单点登录)方案 单点登录(SSO)允许用户通过一次登录访问多个相关系统。以下是基于 Vue 的实现方案: 使用 OAuth2/OpenID Connect 协议 OAuth2…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue实现select

vue实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML select 元素 原生 HTML 的 <sel…

vue实现模糊

vue实现模糊

Vue实现模糊搜索的方法 在Vue中实现模糊搜索功能通常需要结合输入框和列表渲染,通过监听输入内容动态过滤数据。以下是几种常见实现方式: 使用计算属性实现 计算属性适合处理需要响应式更新的搜索逻辑:…

vue导航实现

vue导航实现

Vue 导航实现方法 在 Vue 中实现导航功能通常涉及路由配置、组件设计和状态管理。以下是几种常见的实现方式: 使用 Vue Router 实现基础导航 安装 Vue Router: npm i…