理论我的项目中,除了根本的树结构,有时还需扩大。如下图层级关系的递归调用,红框中的局部为齐全递归组件。
父级:
template
<div class="dept-tree-show">
<div class="teer-deep">
<div class="per-teer first-teer clearfix">
<template v-for="(item) in deptlist">
<div class="pt-item ft-item"
:key="item.id"
v-if="item.treeType==activedepttree.code"
:class="{'disactive': teer2,'active': (teer2&&teer2.code==item.code)
}"@click.stop="openChildren(item)">
<div class="top-title">{{item.name.slice(0,2)}}</div>
<div class="total-more" title="人员列表"
@click.stop="showRelatedUsers(item)">
<i :class="item.userloading?'el-icon-loading':'fa fa-users'"></i>
</div>
<div class="total-title">{{item.name}}</div>
<!-- <div class="total-code">{{item.code}}</div> -->
<div class="total-children" @click.stop="openChildren(item)">
{{(item.children&&item.children.length)?item.children.length:0}}
<i :class="(teer2&&teer2.code==item.code)?'el-icon-arrow-up':'el-icon-arrow-down'"></i>
</div>
</div>
</template>
</div>
<secondtree
v-if="teer2"
:openitem="teer2"
@closetopChildren="closetopChildren"
@showRelatedUsers="showRelatedUsers"></secondtree>
</div>
</div>
js:
//.... 不残缺代码
import secondtree from './dept/childrenteer.vue'
//.... 不残缺代码
components:{secondtree}
//.... 不残缺代码
子级:
<template>
<div class="wrap-wrap">
<div class="children-teer-wrap" @click.stop v-if="opendata">
<div class="breaker" :id="opendata.id">
<div class="line">
<div class="line-left"></div>
<div class="line-right"></div>
</div>
<div class="baseinfo">
<div class="l-title">{{opendata.name}}</div>
<div class="l-close" @click.stop="closeChildren(opendata)"> 收起 </div>
</div>
</div>
<div class="per-teer children-teer clearfix">
<template v-for="(item) in opendata.children">
<div
class="pt-item ct-item"
:key="item.id"
@click.stop="openChildren(item)"
:class="{'disactive': treedata,'active': (treedata&&treedata.code==item.code)
}">
<div class="top-title">{{item.name.slice(0,2)}}</div>
<div class="total-title">{{item.name}}</div>
<div class="total-more" title="人员列表" @click.stop="showRelatedUsers(item)"><i :class="item.userloading?'el-icon-loading':'fa fa-users'"></i></div>
<!-- <div class="total-code">{{item.code}}</div> -->
<div class="total-children"
@click.stop="openChildren(item)">
{{(item.children&&item.children.length)?item.children.length:0}}
<i :class="(treedata&&treedata.code==item.code)?'el-icon-arrow-up':'el-icon-arrow-down'"></i>
</div>
</div>
</template>
</div>
</div>
<childrentree v-if="treedata" :openitem="treedata" @unActiveParent="unActiveParent" @closeChildren="closeChildren" @showRelatedUsers="showRelatedUsers"></childrentree>
</div>
</template>
<script>
export default {
name:"childrentree",
props:{
openitem:{
type: Object,
default: () => {},
}
},
watch:{openitem(val){
this.opendata=val;
this.treedata=""
}
},
data(){
return{
opendata:this.openitem,
treedata:""
}
},
methods: {openChildren(data){if(this.treedata && this.treedata.code && data&& data.code && this.treedata.code==data.code){this.treedata="";}else{if(data&&data.children && data.children.length){
this.treedata=data;
this.$nextTick(()=>{document.getElementById(data.id).scrollIntoView({behavior: "smooth"})
})
//
}
}
},
unActiveParent(){this.treedata="";},
closeChildren(data){
this.opendata="";
this.$emit('unActiveParent');
this.$emit('closetopChildren');
},
showRelatedUsers(data){this.$emit("showRelatedUsers",data)
}
},
}
</script>
一些重要的废话放到最初:
1:子组件,即须要递归应用的组件,在 js 中是要申明 name(name:”childrentree”)。这样子组件在自身就能够间接应用自身。
2:本例从第二层节点才开始应用递归,所以写发有冗余,可按需精简
3:子组件的事件须要按需辨别是要发动仅紧挨着的下层事件(this.$emit(‘unActiveParent’);)还是顶层事件(this.$emit(‘closetopChildren’);)。能够通过承受的办法名进行辨别
4:开展某一节点后,节点子集的顶部,即大括号顶部的话,能够应用:(依据具体场景自行判断是否须要应用 $nextTick)
document.getElementById(data.id).scrollIntoView({behavior: "smooth"})
如有问题请斧正,如有更简洁的事项形式请留下链接 (✿◡‿◡)