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

实现流程图,借鉴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-switchv-model="horizontal":width="50"active-text="横排"inactive-text="竖排"style="margin-top: 8px"/></el-col><el-col :span="5"><el-switchv-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><!-- 元素放大缩小 拖动 --><divid="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.mzph.cn/news/220970.shtml

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

相关文章

【面试】数据库—优化—如何定位慢查询

数据库—优化—如何定位慢查询 1. 出现慢查询的情况&#xff08;表象&#xff1a;页面加载过慢、接口压测响应时间过长&#xff08;超过1s&#xff09;&#xff09;&#xff1a; 聚合查询多表查询表数据量过大查询深度分页查询 2. 如何定位慢查询 方案一&#xff1a;开源工具…

OpenHarmony 鸿蒙系统之开发环境安装

一、首先在下方链接网址中下载DevEco Studio的安装包。 DevEco Studio历史版本下载-HarmonyOS应用开发官网

[字符串操作]挑选最大值序列

挑选最大值序列 题目描述 给出了若干行非负整数序列&#xff0c;请选择最大值所在的序列&#xff0c;按输入原样输出该序列。如果最大值出现在多个序列&#xff0c;则只输出最大值最后出现的序列。 假设&#xff1a;每个序列中至少有1个整数&#xff0c;至多300个整数&#x…

可替代LM5145,5.5V-100V Vin同步降压控制器_SCT82A30

SCT82A30是一款100V电压模式控制同步降压控制器&#xff0c;具有线路前馈。40ns受控高压侧MOSFET的最小导通时间支持高转换比&#xff0c;实现从48V输入到低压轨的直接降压转换&#xff0c;降低了系统复杂性和解决方案成本。如果需要&#xff0c;在低至6V的输入电压下降期间&am…

(Spring学习08)Spring之容器配置类解析过程源码解析

解析配置类 解析配置类流程图&#xff1a;https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd 解析配置类思维脑图&#xff1a;https://www.processon.com/view/link/614c83cae0b34d7b342f6d14 在启动Spring时&#xff0c;需要传入一个AppConfig.class给Applicat…

CNS0创建交货单没有WBS元素

1、问题 CNS0创建交货单带不出WBS&#xff0c;但是交货单过账之后&#xff0c;又可以读取到WBS。 2、原因 2.1、项目挂料 创建项目挂料时&#xff0c;当物料为通用料&#xff0c;则在网络中挂料时&#xff0c;采购类型为网络预留 当物料为专用料&#xff0c;则在网络中挂料时…

触摸键检测IC TS223——2.0V~5.5V 低功耗和宽工作电压 SSOP16、SOT-23-6封装形式

TS223是触摸键检测IC&#xff0c;提供1个触摸键。触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的。低功耗和宽工作电压是触摸键的DC和AC特点。采用SSOP16、SOT-23-6的封 装形式封装。 主要特点&#xff1a; ● 工作电压2.0V~5.5V ● 工作电流VDD3V&#xff0c; 无…

JavaScript强制类型转换

强制类型转换&#xff1a; 强制类型转换&#xff1a;指将其他的数据类型转换为string、number、boolean 将其他数据类型转换为字符串String()&#xff1a; 方法一&#xff1a; - 可以通过调用被转换值的toString()方法来将其转换为字符串 - 调用xxx的yyy方法 --> xxx.yy…

debian12 最小化安装桌面 i3wm

怕记不住&#xff0c;先临时记录一下&#xff0c;还未整理&#xff0c;先凑合着看 debian12 最小安装 i3wm 一、先安装 debian12 最小安装 软件包只选择最后的两个 SSH服务&#xff0c;和管理工具 安装后查看IP&#xff0c;并用另一台电脑 ssh 连接操作&#xff0c;这样比较…

Android WebView 响应缓存 笔记

Android WebView 响应缓存 在 Android开发中&#xff0c;经常用到 WebView 进行 Hybrid 模式开发&#xff0c;而 缓存是 常见的优化方式。 一、WebView 缓存模式 Android WebView 通过 WebSettings.setCacheMode 设置缓存方式。 有 5 种模式&#xff0c;实际现在 4 种&#…

教你用JMeter做接口测试的几个简单实例

前言 这次小项目是基于HTTP协议的接口&#xff0c;通过JMeter来完成一次基本的接口测试&#xff0c;完整复习一下JMeter的基本操作。 在实际项目中&#xff0c;测试也要先从开发那拿到接口说明书&#xff0c;分析熟悉业务后&#xff0c;写接口的测试用例&#xff0c;最后再在…

Java毕业设计—vue+SpringBoot调查问卷管理系统

研究目的 在进入21世纪以后&#xff0c;互联网得到了蓬勃的发展&#xff0c;电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后&#xff0c;传统问卷还存在很多弊端&#xff1a; 问卷分发起来比较困难&#xff0c;并且分发试卷耗费大量的金钱和时间&#xff1…

2024年金科《数字媒体技术》专业参考书目及考试大纲

《计算机网络基础》考试大纲 一、参考书目&#xff1a; 《计算机网络技术与应用&#xff08;第 2 版&#xff09;》&#xff0c;段标、张玲主编&#xff0c;电子工业出版社. 二、考试形式&#xff1a; 闭卷&#xff0c;考试时间 90 分钟 三、考试内容和要求 &#xff08;一…

Visual Studio(VS)常用快捷键(最详细)

Visual Studio常用快捷键 一、生成&#xff1a;常用快捷键二、调式&#xff1a;常用快捷键三、编辑&#xff1a;常用快捷键四、文件&#xff1a;常用快捷键五、项目&#xff1a;常用快捷键六、重构&#xff1a;常用快捷键七、工具&#xff1a;常用快捷键八、视图&#xff1a;常…

Echarts多图表动态更新示例

前端框架(html、echarts、jquery) <!DOCTYPE html> <html><head><meta charset"utf-8"><title>echarts多图表动态更新示例</title><script src"jquery.min.js"></script><script type"text/java…

强大的TFTP工具:Transfer免激活最新版

Transfer for Mac功能介绍 从头开始编写的Transfer可以完全控制您的文件传输&#xff0c;同时可以与现有的TFTP客户端完美兼容。Transfer附带对常见TFTP协议扩展和选项的支持&#xff0c;包括&#xff1a; RFC 2347-TFTP选项扩展 RFC 2348-TFTP块大小选项 RFC 2349-TFTP超时…

SystemUI下拉通知菜单栏定时自动隐藏

前言 在系统应用开发过程中&#xff0c;常常遇到一些特殊的需求&#xff0c;Android原生的应用并无此适配&#xff0c;此时需要对系统应用进行定制化开发。 目前遇到的这样一个需求&#xff1a;下拉通知菜单栏时&#xff0c;定时8秒后自动关闭通知菜单栏。通知菜单栏为Sytstem…

Python面经【11】- Python可迭代对象一网打尽专题

Python面经【11】- Python可迭代对象一网打尽专题 可迭代对象Python的迭代器、生成器1) 迭代器2) 生成器 可迭代对象、迭代器的区别12. 生成器、迭代器的区别什么是装饰器&#xff1f;函数装饰器有什么作用一句话解释什么样的语言能够使用装饰器Python中的作用域&#xff1f;什…

自卑与自信,自爱的人最幸福

自信与自卑的区别&#xff0c;重要的一点是评价机制的差异 自信的人对自己有一个整体的评价&#xff0c;他们运用内在的评价机制&#xff0c;他们习惯从自己身上找原因&#xff0c;尊重自己内在的感觉&#xff0c;按照自己的直觉行事。也就是说&#xff0c;不管别人如何评价&am…

Linux CentOS7 Docker安装Jenkins

1 sudo yum update #确保yum包更新到最新 service network restart #重启网络 2、查询镜像 docker search jenkins 3、拉取镜像 docker pull jenkins/jenkins #拉取镜像 4、创建Jenkins工作目录&#xff0c;并将容器内目录挂载到此目录…