实现树形结构的插件vue-tree-color及元素放大缩小拖动

news2024/11/26 4:47:21

实现流程图,借鉴vue-tree-color

引入依赖

npm install vue-tree-color


同时查看项目中是否已安装less和less-loader,因为该组件使用到less

npm install --save-dev less less-loader


如果这里启动项目报错,有可能是less和less-loader的版本过高,可以降低版本,或者指定版本号

npm i less@3.9.0 less-loader@4.1.0 -D


添加全局

import Vue2OrgTree from 'vue-tree-color'
Vue.use(Vue2OrgTree)

目录结构

index copy.vue

<template>
  <!-- 组织架构 -->
  <div ref="appContainer" class="app-container">
    <div style="margin-left: 30px">
      <el-row :gutter="20">
        <el-col :span="5">
          <el-switch
            v-model="horizontal"
            :width="50"
            active-text="横排"
            inactive-text="竖排"
            style="margin-top: 8px"
          />
        </el-col>
        <el-col :span="5">
          <el-switch
            v-model="expandAll"
            :width="50"
            active-text="全部展开"
            inactive-text="全部折叠"
            style="margin: 8px"
            @change="expandChange"
          />
        </el-col>
      </el-row>
    </div>
    <div style="font-size: 12px; margin-top: 30px">
      <el-scrollbar :style="scrollTreeStyle" class="el-org-tree">
        <vue2-org-tree
          :data="treeData.data"
          :horizontal="!horizontal"
          :collapsable="collapsable"
          :label-class-name="treeData.labelClassName"
          :render-content="renderContent"
          name="organ"
          @on-expand="onExpand"
          @on-node-click="onNodeClick"
        />
      </el-scrollbar>
    </div>
    <br /><br />
  </div>
</template>
 
 
<script>
export default {
  name: "TreeTest",
  data() {
    return {
      treeData: {
        labelClassName: "bg-color-orange",
        basicInfo: { id: null, label: "---null" },
        basicSwitch: false,
        data: {
          id: 0,
          label: "XXX科技有限公司",
          children: [
            {
              id: 2,
              label: "产品研发部",
              children: [
                {
                  id: 5,
                  label: "研发-前端",
                  children: [
                    {
                      id: 55,
                      label: "前端1",
                    },
                    {
                      id: 56,
                      label: "前端2",
                    },
                    {
                      id: 57,
                      label: "前端3",
                    },
                    {
                      id: 58,
                      label: "前端4",
                    },
                  ],
                },
                {
                  id: 6,
                  label: "研发-后端",
                },
                {
                  id: 9,
                  label: "UI设计",
                },
                {
                  id: 10,
                  label: "产品经理",
                },
              ],
            },
            {
              id: 3,
              label: "销售部",
              children: [
                {
                  id: 7,
                  label: "销售一部",
                },
                {
                  id: 8,
                  label: "销售二部",
                },
              ],
            },
            {
              id: 4,
              label: "财务部",
            },
            {
              id: 9,
              label: "HR人事",
            },
          ],
        },
      },
      horizontal: true, //横版 竖版
      collapsable: false,
      expandAll: true, //是否全部展开

      scrollTreeStyle: "width:100%;",
    };
  },
  methods: {
    //渲染节点
    renderContent(h, data) {
      return (
        <div>
          <div>
            <i class="el-icon-user-solid"></i>
            <span>{data.label}</span>
            <span>男</span>
          </div>
          <div style="font-size:12px;line-height:20px;">测试人员</div>
        </div>
      );
    },

    //鼠标移出
    onMouseout(e, data) {
      this.treeData.basicSwitch = false;
    },
    //鼠标移入
    onMouseover(e, data) {
      this.treeData.basicInfo = data;
      this.treeData.basicSwitch = true;
      var floating = document.getElementsByClassName("floating")[0];
      floating.style.left = e.clientX + "px";
      floating.style.top = e.clientY + "px";
    },
    //点击节点
    NodeClick(e, data) {
      console.log(e, data);
    },
    //默认展开
    toggleExpand(data, val) {
      if (Array.isArray(data)) {
        data.forEach((item) => {
          this.$set(item, "expand", val);
          if (item.children) {
            this.toggleExpand(item.children, val);
          }
        });
      } else {
        this.$set(data, "expand", val);
        if (data.children) {
          this.toggleExpand(data.children, val);
        }
      }
    },
    collapse(list) {
      list.forEach((child) => {
        if (child.expand) {
          child.expand = false;
        }
        child.children && this.collapse(child.children);
      });
    },
    //展开
    onExpand(e, data) {
      if ("expand" in data) {
        data.expand = !data.expand;
        if (!data.expand && data.children) {
          this.collapse(data.children);
        }
      } else {
        this.$set(data, "expand", true);
      }
    },
    getList() {
      // 后台回去的数据 赋值给data即可
    },

    // 自定义您的点击事件
    onNodeClick(e, data) {
      alert("点击");
    },

    expandChange() {
      this.collapsable = true;
      this.toggleExpand(this.treeData.data, this.expandAll);
    },
  },
};
</script>
 

<style lang="less">

.org-tree-node-label-inner {
  color: #fff;
  background-color: orange;
}

.el-org-tree {
  .el-scrollbar__wrap {
    overflow-x: hidden;
  }
  .org-tree-node-label {
    white-space: nowrap;
  }
  .el-tree-node__content {
    background: white;
  }
  .org-tree-node-label .org-tree-node-label-inner {
    padding-top: 8px;
    padding-right: 10px;
    padding-bottom: 5px;
    padding-left: 10px;
    cursor: pointer;
  }
  .horizontal .org-tree-node.is-leaf {
    padding-top: 5px;
    padding-bottom: 5px;
  }
}
</style>

index.vue

<template>
  <!-- 元素放大缩小 拖动 -->
  <div
    id="drag"
    @mousewheel.prevent="changeCanvas($event)"
    @mousedown="mouseDrag($event)"
    @dragover="allowDrop($event)"
    @dragenter="dragEnter($event)"
    @mouseup="mouseUp($event)"
    @mousemove="mouseMove($event)"
  >
    <div id="flowContainer" ref="flowContainer">
      <simple-tree />
    </div>
  </div>
</template>
<script>
import simpleTree from "./index copy";
export default {
  name: "",
  components: {
    simpleTree,
  },
  computed: {},
  data() {
    return {
      msg: "111",
      zoomNum: 1,
      disX: null,
      disY: null,
      mainX: null,
      mainY: null,
      ifDrag: false,
    };
  },
  methods: {
    allowDrop(evt) {
      this.preventDefault(evt);
    },
    dragEnter(evt) {
      this.preventDefault(evt);
    },
    //阻止冒泡以及默认事件
    preventDefault(ev) {
      var evt = ev || window.event;
      if (typeof evt.preventDefault == "function") {
        evt.preventDefault();
      } else {
        evt.returnValue = false;
      }
      if (typeof evt.stopPropagation == "function") {
        evt.stopPropagation();
      } else {
        evt.cancelBubble = true;
      }
    },
    // ==漫游====
    // 拖拽
    mouseDrag(e) {
      // console.log('拖拽',e);
      this.linemove = false;
      // console.log(e)
      let _this = this;
      this.ifDrag = true;
      let pos = _this.getPos(e); //获取鼠标坐标
      _this.disX = pos.x;
      _this.disY = pos.y;
      _this.mainX = _this.$refs.flowContainer.offsetLeft;
      _this.mainY = _this.$refs.flowContainer.offsetTop-60;
      // if (this.ifDrag) {
      //   this.mouseMove(e);
      // }
    },
    mouseMove(e) {
      // console.log('move', document)
      var _this = this;
      // document.onmousemove = function (e) {
      //   debugger
      // console.log(e)
      //   e.preventDefault()
      if (!this.ifDrag) {
        return;
      }
      var evt = window.event || e;
      var left = evt.clientX - _this.disX + _this.mainX;
      var top = evt.clientY - _this.disY + _this.mainY;
      _this.$refs.flowContainer.style.left = left + "px";
      _this.$refs.flowContainer.style.top = top + "px";
      // }
      // this.mouseUp();
    },
    mouseUp() {
      // console.log('up', document.onmousemove)
      var _this = this;
      this.ifDrag = false;
      //鼠标抬起
      document.onmouseup = function (e) {
        // console.log(e)
        var evt = window.event || e;
        // document.onmousemove = null;
        // document.onmouseup = null;
        // _this.ifDrag = false;
      };
    },
    // 获取位置
    getPos(ev) {
      let scrollTop =
        document.documentElement.scrollTop || document.body.scrollTop;
      let scrollLeft =
        document.documentElement.scrollLeft || document.body.scrollLeft;
      return { x: ev.clientX + scrollLeft, y: ev.clientY + scrollTop };
    },
    // 改变画布大小--通过鼠标滚轮 缩小,放大
    changeCanvas(event) {
      var delta = 0;
      var canvasDom = document.getElementById("flowContainer");
      var p = ["webkit", "moz", "ms", "o"];
      if (!event) event = window.event;
      if (event.wheelDelta) {
        //IE、chrome浏览器使用的是wheelDelta,并且值为“正负120”
        delta = event.wheelDelta / 120;
        if (window.opera) delta = -delta; //因为IE、chrome等向下滚动是负值,FF是正值,为了处理一致性,在此取反处理
      } else if (event.detail) {
        //FF浏览器使用的是detail,其值为“正负3”
        delta = -event.detail / 3;
      }
      if (delta > 0) {
        // 向上滚
        if (this.zoomNum < 2) {
          this.zoomNum += 0.1;
        }
      } else if (delta < 0) {
        // 向下滚
        if (this.zoomNum > 0.2) {
          this.zoomNum -= 0.1;
        }
      }
      for (var i = 0; i < p.length; i++) {
        canvasDom.style[p[i] + "Transform"] = "scale(" + this.zoomNum + ")";
      }
      canvasDom.style["transform"] = "scale(" + this.zoomNum + ")";
      return false;
    },
  },
  mounted() {
  },
  created() {},
  destroyed() {},
};
</script>

<style scoped>
#drag {
  width: 100%;
  height: 800px;
  background: #ccc;
  overflow: hidden;
}
#flowContainer {
  width: 100%;
  height: 100%;
  background: #fff;
  position: relative;
  overflow: hidden;
  left: 0px;
  top: 0px;
  transform-origin: 50% 50%;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建Flutter开发环境、从零基础到精通(文末送书【北大出版社】)

目录 搭建开发环境 1. 下载Flutter SDK 2. 设置镜像地址及环境变量 3. 安装与设置Android Studio 4. 安装Visual Studio Code与Flutter开发插件 5. IDE的使用和配置 6. 安装Xcode 7. 检查Flutter开发环境 好书推荐 内容简介 作者简介 搭建开发环境 Flutter可以跨平…

5款不可或缺的办公软件,好用且使用频率超高,几乎每个人都需要

在当今数字化时代&#xff0c;办公软件成为了现代职场必备的工具。这些软件可以大大提高我们的办公效率&#xff0c;简化工作流程&#xff0c;使我们更加高效地完成任务。今天给大家分享5款不可或缺的办公软件&#xff0c;它们不仅好用&#xff0c;而且使用频率极高&#xff0c…

使用Gensim训练Word2vec模型

import gensim import jieba import re import warnings import logging warnings.filterwarnings(ignore)with open("dataset/sanguo.txt", r,encodingutf-8)as f: # 读入文本lines []for line in f: #分别对每段分词temp jieba.lcut(line) #结巴分词 精确模式wo…

股票价格预测 | Python实现基于Stacked-LSTM的股票预测模型,可预测未来(keras)

文章目录 效果一览文章概述模型描述源码设计效果一览 文章概述 以股票价格预测为例,基于Stacked-LSTM的股票预测模型(keras),可预测未来。 模型描述 LSTM 用于处理序列数据,如时间序列、文本和音频。相对于传统的RNN,LSTM更擅长捕获长期依赖关系,

C# WPF上位机开发(ExtendedWPFToolkit扩展包使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然个人人为当前的c# wpf内容已经足够多&#xff0c;但是肯定还是有很多个性化的需求没有满足。比如说不够好看&#xff0c;比如说动画效果不好&a…

【C++】POCO学习总结(十八):XML

【C】郭老二博文之&#xff1a;C目录 1、XML文件格式简介 1&#xff09;XML文件的开头一般都有个声明&#xff0c;声明是可选 <&#xff1f;xml version"1.0" encoding"UTF-8"?>2&#xff09;根元素&#xff1a;XML文件最外层的元素 3&#xff…

不同vlan设备互通案例操作介绍

目录 一、案例示图需求 1. 示图 2. 需求 二、操作演示 1. 接入层交换机SW4、SW5划分vlan 2. 汇聚层交换机SW2、SW3配置IP作为vlan网关、与SW1直连 3. 核心交换机SW1配置IP与汇聚交换机、R1直连 4. SW1、SW2、SW3、R1配置静态路由&#xff0c;使得vlan10、vlan20、172网…

Vue项目使用WebAssembly之后,Nginx如何解决WebAssembly不支持的问题

在VUE项目中使用WebAssembly之后&#xff0c;打包的项目会出现下面的错误 Uncaught (in promise) TypeError: WebAssembly: Response has unsupported MIME type application/wasm; charsetutf-8 expected application/wasm 可以用以下办法解决 一&#xff1a;单独Nginx配置…

YK3150滚齿机电池式绝对编码器电压过低导致丢失多圈数据,如何清多圈

当驱动器电池没电了&#xff0c; 就会报警如下 C轴驱动器&#xff1a;041&#xff08;0x29&#xff09; 电池式绝对编码器电压过低导致丢失多圈数据 此时需要换电池后&#xff0c;进行【清多圈】操作&#xff0c;先把【伺服参数开关】打开&#xff08;一定要记得&#xff09…

Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

音视频:Ubuntu下安装 FFmpeg 5.0.X

1.安装相关依赖 首可选一&#xff1a; sudo apt-get update sudo apt-get install build-essential autoconf automake libtool pkg-config \libavcodec-dev libavformat-dev libavutil-dev \libswscale-dev libresample-dev libavdevice-dev \libopus-dev libvpx-dev libx2…

自动化测试Selenium node 配置

查看自己chrome浏览器的版本 下载chromedriver对应版本&#xff0c;下载当前版本中最大版本。 https://npm.taobao.org/mirrors/chromedriver 安装java jdk &#xff0c;版本至少1.7, 并配置jdk环境变量 以下2个文件放在同一个目录下 Cmd地址切换到第四点目录下&#xff0c;然…

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表 剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表解法1&#xff1a;中序遍历 - 递归解法2&#xff1a;中序遍历 - 迭代 剑指 Offer&#xff08;第2版&am…

智能电力监控管理系统在物业小区的应用——安科瑞 顾烊宇

0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变&#xff08;箱式变电站&#xff0c;下同&#xff09;位置困难或小区出入口路径不明等情况&#xff0c;影响了抢修效率。为此&#xff0c;国网辽宁沈阳市沈北新区供电公司依托原有GIS平台…

C/C++ STL提供的关联式容器之set

set&#xff08;集合&#xff09;顾名思义&#xff0c;就是数学上的集合 —— 每个元素最多只出现一次&#xff0c;并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现&#xff0c;其内部元素依据其值自动排序&#xff0c;每个元素值只能出现一次&#xff0c;…

海思平台isp之raw图回灌调试

文章目录 一、搭建环境二、配置参数三、回灌raw图isp调试中,经常会遇到一些特定场景的效果需要优化,但由于某些原因和成本考虑,开发人员无法亲临现场,这个时候采集场景raw图回灌到板端调试,就显得尤为方便了。 一、搭建环境 (1)建立板端与PQTool连接 板端进入SS928V100…

【基础算法】前缀和

文章目录 算法介绍什么是前缀和&#xff1f;&#xff1f;前缀和的作用一维数组求解前缀和(Si)二维数组求解前缀项和 示例题目1&#xff1a;acwing795示例题目2&#xff1a;acwing796总结收获 算法介绍 什么是前缀和&#xff1f;&#xff1f; 数组: a[1], a[2], a[3], a[4], a[…

Nat Med | Tau靶向反义寡核苷酸

今天给同学们分享一篇实验文章“Tau-targeting antisense oligonucleotide MAPTRx in mild Alzheimers disease: a phase 1b, randomized, placebo-controlled trial”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 患者 从201…

Kubernetes (k8s) 快速认知

应用部署方式 传统部署时代 早期的时候&#xff0c;各个组织是在物理服务器上运行应用程序。缺点 资源分配问题&#xff1a; 无法限制在物理服务器中运行的应用程序资源使用 维护成本问题&#xff1a; 部署多个物理机&#xff0c;维护许多物理服务器的成本很高 虚拟化部署时…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…