当前位置:首页 > VUE

vue实现部门树

2026-02-11 00:47:22VUE

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: [
        {
          label: '一级部门',
          children: [
            {
              label: '二级部门1',
              children: [
                { label: '三级部门1' },
                { label: '三级部门2' }
              ]
            },
            {
              label: '二级部门2'
            }
          ]
        }
      ],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    handleNodeClick(data) {
      console.log(data)
    }
  }
}
</script>

使用递归组件实现自定义树

如果需要更灵活的定制,可以自己实现递归组件:

vue实现部门树

<template>
  <div>
    <tree-node :node="treeData"></tree-node>
  </div>
</template>

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

export default {
  components: { TreeNode },
  data() {
    return {
      treeData: {
        name: '总公司',
        children: [
          {
            name: '分公司1',
            children: [
              { name: '部门A' },
              { name: '部门B' }
            ]
          },
          {
            name: '分公司2'
          }
        ]
      }
    }
  }
}
</script>

TreeNode.vue 组件:

<template>
  <div>
    <div @click="toggle">
      {{ node.name }}
    </div>
    <div v-show="isOpen" v-if="node.children">
      <tree-node
        v-for="child in node.children"
        :key="child.name"
        :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>

从后端获取数据并构建树结构

通常部门数据是从后端API获取的,需要处理后转换为树形结构:

vue实现部门树

// 假设从后端获取的是平铺的部门列表
function buildTree(items, id = null, link = 'parentId') {
  return items
    .filter(item => item[link] === id)
    .map(item => ({ ...item, children: buildTree(items, item.id) }))
}

// 在Vue组件中使用
export default {
  data() {
    return {
      deptList: [],
      deptTree: []
    }
  },
  async created() {
    const res = await axios.get('/api/departments')
    this.deptList = res.data
    this.deptTree = buildTree(this.deptList)
  }
}

添加交互功能

可以为树组件添加更多交互功能,如复选框、懒加载等:

<el-tree
  :data="deptTree"
  show-checkbox
  node-key="id"
  lazy
  :load="loadNode"
></el-tree>

<script>
export default {
  methods: {
    async loadNode(node, resolve) {
      if (node.level === 0) {
        // 加载根节点
        const res = await axios.get('/api/departments/root')
        return resolve(res.data)
      }
      // 加载子节点
      const res = await axios.get(`/api/departments/children/${node.key}`)
      resolve(res.data)
    }
  }
}
</script>

样式定制

可以通过CSS对树组件进行样式定制:

.el-tree {
  background: #f5f7fa;
}

.el-tree-node__content {
  height: 40px;
}

.el-tree-node:focus > .el-tree-node__content {
  background-color: #e6f7ff;
}

以上方法提供了多种实现部门树的方案,可以根据项目需求选择合适的实现方式。

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

相关文章

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖…

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理…

vue实现suspense

vue实现suspense

Vue 3 中实现 Suspense Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…