当前位置: 首页 > news >正文

vue3-tree-org创建组织架构图简单案例分享

代码环境:Vue3+ElementPlus+TS

使用感受:简单易操作,推荐使用

1. 效果图

2. main.ts导入

import vue3TreeOrg from "vue3-tree-org";
import "vue3-tree-org/lib/vue3-tree-org.css";
const app = createApp(App);
app.use(vue3TreeOrg);

3.主代码

<script setup lang="ts">
import { ElSwitch, ElColorPicker, ElMessage } from "element-plus";
import { onMounted, ref } from "vue";
import { errorMessage } from "/@/utils/message";
const cloneNodeDrag = ref(true);
const horizontal = ref(false);
const collapsable = ref(true);
const onlyOneNode = ref(false);
const expandLevel = ref(2);
const expandAll = ref(false);
const editDisaled = ref(false);
const labelStyle = ref({
  background: "#108ffe",
  color: "#fff"
});
const dataInfo = ref({});
const data = ref({
  id: 0,
  label: "XXXX科技有限公司",
  leader: "王总",

  children: [
    {
      id: 1,
      pid: 0,
      label: "COO",
      leader: "宋总工",

      children: [
        {
          id: 2,
          pid: 1,
          label: "产品研发部",
          leader: "张三",
          style: { color: "#fff", background: "#108ffe" },
          children: [
            {
              id: 6,
              pid: 2,
              label: "禁止编辑节点",
              leader: "张三1",
              disabled: true
            },
            {
              id: 8,
              pid: 2,
              label: "禁止拖拽节点",
              leader: "张三2",
              noDragging: true
            },
            { id: 10, pid: 2, leader: "张三3", label: "测试" }
          ]
        },
        {
          id: 3,
          pid: 1,
          label: "电气研发部",
          leader: "李工",
          children: [
            {
              id: 11,
              pid: 3,
              label: "研发能力中心",
              leader: "王工"
            },
            {
              id: 12,
              pid: 3,
              label: "平台软件研发",
              leader: "刘工"
            }
          ]
        },
        { id: 4, pid: 1, label: "机械研发部", leader: "刘工", expand: true }
      ]
    }
  ]
});

onMounted(() => {
  try {
    dataInfo.value = data.value;
  } catch (err) {
    errorMessage(err);
  }
});

const beforeDragEnd = (node, targetNode) => {
  console.log("beforeDragEnd");
};

const onNodeClick = (e, data) => {
  ElMessage.info(data.label);
};

const onNodeDblclick = (e, data) => {
  console.log("onNodeDblclick", data);
};
const onMenus = ({ node, command }) => {
  console.log("node", node);
  console.log("command", command);
};

const onExpand = (e, data) => {
  console.log(e, data);
};

// const toggleExpand = (data, val: boolean) => {
//   if (Array.isArray(data)) {
//     data.forEach(item => {
//       item.expand = val;
//       if (item.children) {
//         toggleExpand(item.children, val);
//       }
//     });
//   } else {
//     data.expand = val;
//     if (data.children) {
//       toggleExpand(data.children, val);
//     }
//   }
// };
</script>
<template>
  <div>
    <div style="display: flex; padding: 10px">
      <div style="margin-right: 10px">
        <el-switch v-model="horizontal" /> 横向
      </div>
      <div style="margin-right: 10px">
        <el-switch v-model="collapsable" /> 可收起
      </div>
      <div style="margin-right: 10px">
        <el-switch v-model="editDisaled" />
        禁止编辑
      </div>
      <div style="margin-right: 10px">
        <el-switch v-model="onlyOneNode" /> 仅拖动当前节点
      </div>
      <div style="margin-right: 10px">
        <el-switch v-model="cloneNodeDrag" /> 拖动节点副本
      </div>
    </div>
    <div style="padding: 0 10px 10px">
      背景色:<el-color-picker
        v-model="labelStyle.background"
        size="small"
      />&nbsp; 文字颜色:<el-color-picker
        v-model="labelStyle.color"
        size="small"
      />&nbsp;
    </div>
    <div style="height: 800px">
      <vue3-tree-org
        :data="dataInfo"
        center
        :horizontal="horizontal"
        :collapsable="collapsable"
        :label-style="labelStyle"
        :only-one-node="onlyOneNode"
        :clone-node-drag="cloneNodeDrag"
        :before-drag-end="beforeDragEnd"
        :default-expand-level="expandLevel"
        :disabled="editDisaled"
        @on-contextmenu="onMenus"
        @on-expand="onExpand"
        @on-node-dblclick="onNodeDblclick"
        @on-node-click="onNodeClick"
        ><template v-slot="{ node }">
          <div class="tree-org-node__text node-label">
            <div class="custom-content">{{ node.label }}</div>
            <div>负责人:{{ node.$$data.leader }}</div>
            <!-- <div v-if="node.label === '平台软件研发' || node.label === '测试'">
              {{ node }}
            </div> -->
          </div>
        </template>
      </vue3-tree-org>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.tree-org-node__text {
  text-align: left;
  font-size: 14px;

  .custom-content {
    padding-bottom: 8px;
    margin-bottom: 8px;
    border-bottom: 1px solid currentColor;
  }
}
</style>

相关文章:

  • scala基础
  • 剧本杀APP系统开发,市场发展前景
  • 计算机毕业设计SpringBoot+Vue.js基于工程教育认证的计算机课程管理平台(源码+文档+PPT+讲解)
  • 搭建一个私有NuGet服务器
  • 【AI深度学习基础】NumPy完全指南进阶篇:核心功能与工程实践(含完整代码)
  • OpenCV计算摄影学(10)将一组不同曝光的图像合并成一张高动态范围(HDR)图像的实现类cv::MergeDebevec
  • GEE学习笔记 28:基于Google Earth Engine的Landsat8缨帽变换土壤指数反演——亮度、绿度与湿度分量的提取
  • 白话React第九章React 前沿技术与企业级应用实战
  • 跨平台文件互传工具
  • python-leetcode-斐波那契数
  • FastAPI系列:如何配置跨域访问(CORS)
  • 10. 作者去换监控源了,不知道什么原因,zabbix自定义监控无法获取
  • 微服务面试题及原理
  • 一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)
  • React面试葵花宝典之二
  • 年后 总结
  • 【PCIe 总线及设备入门学习专栏 1.2 -- 访问 PCIe 设备过程】
  • 实现遍历Windows所有字体的基本属性
  • 从黑暗到光明:FPC让盲人辅助眼镜成为视障者的生活明灯!【新立电子】
  • 学习笔记--大模型外接数据库
  • 如何实现一个制作好的网站/爱站查询工具
  • 做网站国外访问/如何制作一个宣传网页
  • wordpress首页摘要设置/seo怎样
  • 装修网站建设方案书/长春免费网上推广
  • 企业建立自己网站主要方式/广州网络seo优化
  • 做爰网站名称/百度seo营销