当前位置:首页 > VUE

vue实现部门树

2026-01-08 08:26:06VUE

Vue 实现部门树的方法

使用递归组件实现树形结构

递归组件是 Vue 中实现树形结构的常见方式。通过组件自身调用自身,可以轻松构建多层级的部门树。

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

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

export default {
  components: { TreeNode },
  data() {
    return {
      treeData: {
        id: 1,
        name: '总公司',
        children: [
          {
            id: 2,
            name: '技术部',
            children: [
              { id: 3, name: '前端组' },
              { id: 4, name: '后端组' }
            ]
          },
          {
            id: 5,
            name: '市场部'
          }
        ]
      }
    }
  }
}
</script>

TreeNode.vue 组件:

<template>
  <ul>
    <li>
      {{ node.name }}
      <tree-node 
        v-for="child in node.children" 
        :key="child.id" 
        :node="child"
        v-if="node.children"
      ></tree-node>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeNode',
  props: ['node']
}
</script>

使用第三方组件库

Element UI 和 Ant Design Vue 等流行 UI 库都提供了现成的树形组件。

使用 Element UI 的 Tree 组件:

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

<script>
export default {
  data() {
    return {
      treeData: [{
        label: '总公司',
        children: [{
          label: '技术部',
          children: [{
            label: '前端组'
          }, {
            label: '后端组'
          }]
        }, {
          label: '市场部'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    handleNodeClick(data) {
      console.log(data)
    }
  }
}
</script>

动态加载数据

对于大型部门结构,可以采用懒加载方式,只在展开节点时加载其子节点数据。

<template>
  <el-tree
    :props="props"
    :load="loadNode"
    lazy
  ></el-tree>
</template>

<script>
export default {
  data() {
    return {
      props: {
        label: 'name',
        children: 'children',
        isLeaf: 'leaf'
      }
    }
  },
  methods: {
    loadNode(node, resolve) {
      if (node.level === 0) {
        // 加载根节点
        return resolve([{ name: '总公司' }])
      }
      if (node.level > 3) {
        // 最多加载到第三级
        return resolve([])
      }

      // 模拟异步加载子节点
      setTimeout(() => {
        const nodes = Array.from({ length: 3 }).map((_, i) => ({
          name: `${node.data.name}-部门${i + 1}`,
          leaf: node.level >= 2
        }))
        resolve(nodes)
      }, 500)
    }
  }
}
</script>

添加交互功能

为部门树添加常见交互功能,如选择、展开/折叠、搜索等。

<template>
  <div>
    <el-input
      placeholder="搜索部门"
      v-model="filterText"
    ></el-input>

    <el-tree
      ref="tree"
      :data="treeData"
      :props="defaultProps"
      :filter-node-method="filterNode"
      show-checkbox
      node-key="id"
      default-expand-all
      :expand-on-click-node="false"
    >
      <span class="custom-tree-node" slot-scope="{ node, data }">
        <span>{{ node.label }}</span>
        <span>
          <el-button
            type="text"
            size="mini"
            @click="() => append(data)"
          >添加</el-button>
          <el-button
            type="text"
            size="mini"
            @click="() => remove(node, data)"
          >删除</el-button>
        </span>
      </span>
    </el-tree>
  </div>
</template>

<script>
export default {
  watch: {
    filterText(val) {
      this.$refs.tree.filter(val)
    }
  },
  methods: {
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    },
    append(data) {
      // 添加子部门逻辑
    },
    remove(node, data) {
      // 删除部门逻辑
    }
  }
}
</script>

与后端API集成

实际项目中,部门数据通常来自后端API,需要处理异步数据加载。

export default {
  data() {
    return {
      treeData: []
    }
  },
  created() {
    this.fetchDepartmentTree()
  },
  methods: {
    async fetchDepartmentTree() {
      try {
        const response = await axios.get('/api/departments/tree')
        this.treeData = response.data
      } catch (error) {
        console.error('获取部门树失败:', error)
      }
    }
  }
}

vue实现部门树

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

相关文章

vue实现菜单

vue实现菜单

Vue 实现菜单的方法 在 Vue 中实现菜单功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-for 动态生成菜单项 通过数据驱动的方式,利用 v-for 指令动态渲染菜单项。定义一个数…

vue公共列表的实现

vue公共列表的实现

实现 Vue 公共列表组件 公共列表组件通常用于展示重复结构的数据,例如商品列表、用户列表等。以下是一个典型的实现方式: 基础实现 创建可复用的列表组件 List.vue: <templ…

vue中如何实现循环

vue中如何实现循环

在 Vue 中实现循环 Vue 提供了 v-for 指令用于实现循环渲染列表数据。v-for 可以遍历数组、对象或数字范围,生成动态的 DOM 元素。 遍历数组 使用 v-for 遍历数组时,语法为…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…

vue实现弹窗可切换

vue实现弹窗可切换

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

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginate…