当前位置: 首页 > Web前端 > vue.js

vue树图组件包

时间:2023-03-31 21:15:35 vue.js

前言背景说明有很多插件可以满足树图的需求。但是针对特定的需求,插件中或多或少的小问题是无法满足的。于是看了一些插件,熟悉了里面的原理,就准备自己封装一个树形图组件。为了解释得更清楚,最好在脑海中有一个画面,这样更容易理解和展开。1.即我们先定义一个组件,在这个组件中绘制第一个节点。2.然后在第一个节点下递归调用自己的组件。这样一串像糖葫芦一样的节点就可以实现了3,但是这只是一个字符串,不是一棵树,所以需要在这个基础上画节点的地方加上圆形的绘图节点。这变成了一棵树。一般来说,先易后难。先把树干搞清楚,然后慢慢给树干加上树枝,这样就会画出一棵大树来展示详细的设计步骤(我个人不喜欢直接贴代码。上来,所以尝试用文字和简码把整个设计过程写清楚)1.数据格式[{label:'显示文字',pictype:'图标类型',children:[{label:'显示文字',pictype:'图标类型',children:[{label:'显示文字',pictype:'图标类型',},{label:'显示文字',pictype:'图标类型',},]},{label:'显示文字',pictype:'图标类型',children:[{label:'显示文字',pictype:'图标类型',}]},]}]2.数据格式解析这是获取到的数据格式,一般是后端返回前端,但是直接传给组件是不行的,因为需要考虑节点展开的高度。我在封装的时候,为了让组件内部更容易理解,我把height这个属性传入了组件。之前添加。计算格式如下:1、遍历数组,将节点对象中children属性的“所有叶子节点”的个数乘以节点的高度。2、假设节点的高度为70,以上图的数据格式为例,一个根节点对象中的孩子有两个节点对象,第一个孩子节点对象有2个叶子节点,第二个根节点对象有1个叶子节点,所以根节点的高度是703,第一个子节点的高度是702,第二个子节点的高度是701,所有叶子节点的高度也是7013,函数补充//计算高度,并添加高度属性,nodeInfo为根节点travelTree(nodeInfo){letchildrenInfo=nodeInfo.children;如果(!childrenInfo||childrenInfo.length==0){nodeInfo.height=77;}else{//遍历叶子节点并为每个叶子节点分配一个高度childrenInfo.map((item)=>{this.traveTree(item);});//每个节点的高度与其子节点的高度相加nodeInfo.height=childrenInfo.reduce((preV,n)=>{returnpreV+n.height;},0);}返回nodeInfo;}3。组件内部代码//这是节点的循环,下面是一个节点的内部组成//这是前面的竖线,竖线的高度是确定的通过节点数据的高度和长度以及数据的索引//这是前面的横线//这个是节点,包括图标,文字,还有展开和收缩图标

//图标//展开和收缩图标收缩按钮图标在此处添加一个属性来控制当前节点的递归调用,这样就可以实现展开收缩的效果//显示文字{{itemlabel}}
//这是//这是一个递归调用。当children为空或者icon正在缩小的时候,是不会显示的。
4.上面的函数补充(计算高度的函数)computerHeight(item.height,data.length,index){//当前节点是唯一的子节点或者叶子节点,前面的竖线是0if(length==1||length==0){return{height:'0px',display:'none'};}else{//当前节点是多个子节点之一一会儿,通过当前节点的索引判断上一条竖线的高度letheight=0;让marginTop=0;letmarginB=0;//当是第一个子节点时,去掉一半高度,减少一半边距if(index==0){height=pheight/2;上边距=高度;return{height:height+'px','margin-top':marginTop+'px'};}//当是最后一个子节点时,去掉一半高度,增加一半边距if(index==length-1){height=pheight/2;边距B=高度;return{height:height+'px','margin-bottom':marginB+'px'};}else{height=pheight;return{height:height+'px'};}}}扩展1.需求中必须添加的是通过点击图片逐层回调节点信息2.根节点和叶子节点特殊的地方我没有标注,这里要添加,根节点不需要节点前面的竖线和横线,叶子节点不需要后面的横线,只需要在里面加点判断即可。无需展示。扩展和收缩按钮的功能主要是切换图标,增加一个节点控件属性,将控制扩展和收缩的字段值赋值给这个节点控件属性,用于在递归组件进行显式和隐式判断。这样可以实现对当前节点进行扩展和收缩的效果。内容很多,代码没有全部贴出来,因为觉得不需要展示,码字不易,望指正!