实现树形结构的插件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应用开发官网

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

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

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; 无…

教你用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;一…

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;什…

Linux CentOS7 Docker安装Jenkins

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

远程服务器——如何在Conda中安装R环境

目录 1. R的安装2. VScode 配置参考文献 1. R的安装 推荐使用anaconda或者miniconda&#xff0c;创建虚拟环R_env境然后安装R&#xff1b; 使用conda search r-base查看可下载的R的版本&#xff1b;R版本比较低&#xff0c;一般可以先增加源&#xff1a; % 增加源 conda con…

计算机视觉技术在智慧城市建设中的应用

计算机视觉技术在智慧城市建设中的应用 随着城市化进程的不断推进&#xff0c;更多的人们选择在城市生活、工作和娱乐。面对快速增长的人口和日益复杂的城市环境&#xff0c;很多城市开始探索智慧城市的建设。智慧城市的核心就是将现代信息技术应用于城市管理中&#xff0c;以…

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

07用户行为日志数据采集

用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 按照规划&#xff0c;该Flume需将Kafka中topic_log的数据发往HDFS。并且对每天产生的用户行为日志进行区分&am…

C/C++ 表达式求值(含多位数)

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、解析 分析 最后直接上代码&#xff01; 一、前言 表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼…

WEB 3D技术 以vue3+vite环境为例 讲解vue项目中使用three

上文 WEB 3D 技术&#xff0c;通过node环境创建一个three案例 中 我们打造了自己的第一个Web 3D界面 那么 今天 我们就来结合vue来开发我们的3D界面 这里 我们先创建一个文件夹 作为文件目录 千万不要放C盘 我们 依旧是在终端执行命令 npm init vitelatest输入一下项目名称 …

同城线下社交搭子,同城圈子交友系统

简介:打破传统耗时耗力的交友模式&#xff0c;实现1对1,点对点的快速即时交友模式&#xff0c;线上线下 整合&#xff0c;可在线查看状态以及距离远近&#xff0c;可自行设置每单的收益提成以及代理的分佣提成。 结构: TINKPHP框架 公众号H5;系统开源&#xff0c;方便二次开发…