当前位置:首页 > VUE

vue实现部门树

2026-03-28 10:49:32VUE

Vue 实现部门树的方法

使用 Element UI 的 Tree 组件

Element UI 提供了 Tree 组件,可以方便地实现部门树结构。以下是一个基本示例:

<template>
  <el-tree
    :data="deptTree"
    :props="defaultProps"
    @node-click="handleNodeClick"
  ></el-tree>
</template>

<script>
export default {
  data() {
    return {
      deptTree: [],
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    }
  },
  created() {
    this.fetchDeptTree()
  },
  methods: {
    fetchDeptTree() {
      // 假设 API 返回的数据格式为树形结构
      // 例如:[{ id: 1, name: '总公司', children: [...] }]
      axios.get('/api/dept/tree').then(response => {
        this.deptTree = response.data
      })
    },
    handleNodeClick(data) {
      console.log('点击节点:', data)
    }
  }
}
</script>

递归组件实现自定义树

如果需要更灵活的树形结构,可以创建递归组件:

<template>
  <div class="dept-tree">
    <tree-node
      v-for="node in treeData"
      :key="node.id"
      :node="node"
    ></tree-node>
  </div>
</template>

<script>
import TreeNode from './TreeNode.vue'

export default {
  components: { TreeNode },
  data() {
    return {
      treeData: []
    }
  },
  created() {
    this.fetchTreeData()
  },
  methods: {
    fetchTreeData() {
      axios.get('/api/dept/tree').then(response => {
        this.treeData = response.data
      })
    }
  }
}
</script>

TreeNode.vue 中:

<template>
  <div class="tree-node">
    <div @click="toggle">
      {{ node.name }}
    </div>
    <div v-show="isOpen" class="children">
      <tree-node
        v-for="child in node.children"
        :key="child.id"
        :node="child"
      ></tree-node>
    </div>
  </div>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    node: Object
  },
  data() {
    return {
      isOpen: false
    }
  },
  methods: {
    toggle() {
      this.isOpen = !this.isOpen
    }
  }
}
</script>

使用第三方树组件库

Vue生态中有多个成熟的树组件库:

  1. Vue Draggable Tree - 支持拖拽功能的树组件
  2. Vue Tree Select - 树形选择器
  3. Vue JsTree - 功能丰富的树组件

安装示例(以 Vue Draggable Tree 为例):

npm install vue-draggable-tree

使用示例:

<template>
  <vue-draggable-tree
    :data="treeData"
    :allowDrag="allowDrag"
    @change="onTreeChange"
  />
</template>

<script>
import VueDraggableTree from 'vue-draggable-tree'

export default {
  components: { VueDraggableTree },
  data() {
    return {
      treeData: []
    }
  },
  methods: {
    allowDrag(node) {
      return node.level < 3 // 只允许前3级拖动
    },
    onTreeChange(newTree) {
      this.treeData = newTree
    }
  }
}
</script>

后端数据格式建议

部门树通常需要后端返回嵌套的树形结构数据,格式如下:

[
  {
    "id": 1,
    "name": "总公司",
    "children": [
      {
        "id": 2,
        "name": "技术部",
        "children": []
      }
    ]
  }
]

如果后端返回的是扁平数据,可以在前端转换为树形结构:

vue实现部门树

function buildTree(items, parentId = null) {
  return items
    .filter(item => item.parentId === parentId)
    .map(item => ({
      ...item,
      children: buildTree(items, item.id)
    }))
}

性能优化建议

  1. 虚拟滚动 - 对于大型部门树,考虑使用虚拟滚动提高性能
  2. 懒加载 - 只在展开节点时加载子节点数据
  3. 缓存数据 - 使用 Vuex 或 Pinia 管理树状态,避免重复请求

常见功能扩展

  1. 搜索过滤 - 添加搜索框过滤树节点
  2. 节点操作 - 实现增删改查部门节点
  3. 权限控制 - 根据用户权限显示/隐藏某些节点
  4. 多选功能 - 支持同时选择多个部门

以上方法可以根据具体需求选择或组合使用,Element UI 的 Tree 组件适合大多数基础场景,而自定义递归组件则提供更大的灵活性。

标签: 部门vue
分享给朋友:

相关文章

vue实现弹窗可切换

vue实现弹窗可切换

实现弹窗可切换的 Vue 方案 动态组件切换 通过 Vue 的 <component :is="currentComponent"> 动态加载不同弹窗组件,结合 v-if 控制显示状态。…

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-for…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue实现返回

vue实现返回

返回按钮功能实现 在Vue中实现返回功能通常有两种方式:使用浏览器历史记录的history.back()或结合Vue Router进行编程式导航。以下是具体实现方法: 使用浏览器API metho…