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

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

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

<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获取的,需要处理后转换为树形结构:

// 假设从后端获取的是平铺的部门列表
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对树组件进行样式定制:

vue实现部门树

.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中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <templ…

vue插槽实现

vue插槽实现

插槽的基本概念 Vue插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段,子组件通过<slot>标签定义接收位置。插槽的核心作用是增强组件的灵活性和复用性。 默认插槽 子…

vue实现转盘抽奖

vue实现转盘抽奖

Vue 实现转盘抽奖 基本思路 转盘抽奖的核心是通过 CSS 动画实现旋转效果,Vue 负责控制旋转逻辑和数据绑定。关键点包括转盘扇形区域的绘制、旋转动画的触发与停止、中奖结果的判定。 实现步骤 H…

vue实现页面定位

vue实现页面定位

Vue 实现页面定位的方法 在 Vue 中实现页面定位通常可以通过以下几种方式完成,包括使用原生 JavaScript 的 scrollIntoView 方法、Vue Router 的滚动行为配置,以…

vue点击实现动画

vue点击实现动画

Vue 中实现点击动画的方法 使用 Vue 过渡(Transition)组件 Vue 提供了内置的 <transition> 组件,可以轻松实现元素进入/离开的动画效果。结合 v-if 或…

实现vue页面回退

实现vue页面回退

监听浏览器返回事件 在Vue组件中使用beforeRouteLeave导航守卫,可以监听路由变化。该方法在离开当前路由前触发,适用于需要确认或保存数据的场景。 beforeRouteLeave(…