当前位置:首页 > VUE

vue elementui实现机构树

2026-01-23 10:06:05VUE

实现机构树的基本思路

使用 Vue 和 ElementUI 实现机构树,主要依赖 ElementUI 的 el-tree 组件。机构树通常展示层级关系数据,支持展开、折叠、选中等交互功能。

安装 ElementUI

确保项目中已安装 ElementUI。若未安装,可以通过以下命令安装:

npm install element-ui -S

在 main.js 中引入 ElementUI:

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

数据结构准备

机构树的数据通常为嵌套结构,每个节点包含 label(显示文本)、children(子节点)等属性。示例数据如下:

treeData: [
  {
    label: '一级机构',
    children: [
      {
        label: '二级机构1',
        children: [
          { label: '三级机构1' },
          { label: '三级机构2' }
        ]
      },
      {
        label: '二级机构2',
        children: [
          { label: '三级机构3' }
        ]
      }
    ]
  }
]

使用 el-tree 组件

在 Vue 模板中使用 el-tree 组件绑定数据:

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

配置 props 以指定数据结构的字段名:

data() {
  return {
    treeData: [...], // 机构树数据
    defaultProps: {
      children: 'children',
      label: 'label'
    }
  };
}

处理节点点击事件

通过 @node-click 事件监听节点点击,并获取当前节点数据:

methods: {
  handleNodeClick(data) {
    console.log('点击节点:', data);
  }
}

自定义节点内容

如果需要自定义节点显示内容,可以使用 scoped slot

<el-tree :data="treeData" :props="defaultProps">
  <span slot-scope="{ node, data }" class="custom-node">
    <span>{{ node.label }}</span>
    <span v-if="node.level === 1" class="custom-tag">一级机构</span>
  </span>
</el-tree>

添加复选框支持

通过 show-checkbox 属性启用复选框:

<el-tree
  :data="treeData"
  :props="defaultProps"
  show-checkbox
  @check-change="handleCheckChange"
></el-tree>

监听复选框变化事件:

methods: {
  handleCheckChange(data, checked, indeterminate) {
    console.log('节点选中状态变化:', data, checked, indeterminate);
  }
}

动态加载节点数据

对于大型机构树,可以通过 lazyload 方法动态加载子节点:

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

实现 loadNode 方法:

methods: {
  loadNode(node, resolve) {
    if (node.level === 0) {
      // 加载根节点
      resolve([{ label: '一级机构', isLeaf: false }]);
    } else {
      // 根据 node.data 加载子节点
      setTimeout(() => {
        resolve([
          { label: '二级机构1', isLeaf: false },
          { label: '二级机构2', isLeaf: true }
        ]);
      }, 500);
    }
  }
}

样式调整

通过 CSS 自定义树形结构的样式:

.custom-node {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-right: 8px;
}
.custom-tag {
  background: #f0f2f5;
  padding: 2px 6px;
  border-radius: 3px;
  font-size: 12px;
}

完整示例代码

以下是一个完整的 Vue 组件示例:

vue elementui实现机构树

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

<script>
export default {
  data() {
    return {
      treeData: [
        {
          label: '一级机构',
          children: [
            {
              label: '二级机构1',
              children: [
                { label: '三级机构1' },
                { label: '三级机构2' }
              ]
            },
            {
              label: '二级机构2',
              children: [
                { label: '三级机构3' }
              ]
            }
          ]
        }
      ],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    };
  },
  methods: {
    handleNodeClick(data) {
      console.log('点击节点:', data);
    }
  }
};
</script>

通过以上步骤,可以快速实现一个功能完整的机构树组件,支持交互和动态数据加载。

标签: 机构vue
分享给朋友:

相关文章

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件:…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &l…

vue实现逻辑

vue实现逻辑

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

vue实现开关

vue实现开关

Vue 实现开关组件的方法 使用原生HTML和Vue数据绑定 通过v-model绑定复选框的checked状态,结合CSS样式实现开关效果: <template> <label…

vue实现表单

vue实现表单

Vue 表单实现方法 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定。适用于 input、textarea、select 等元素。 <template> <…

vue事件实现

vue事件实现

Vue 事件实现方法 在Vue中,事件处理是通过v-on指令或@简写来实现的。以下是几种常见的事件处理方式: 使用v-on指令绑定事件 <button v-on:click="handleC…