效果图
组件
<template><div class="processBox" v-if="list.length"><div class="childs"><div class="child" v-for="(item,index) in list" :key="item.id +'-child-'+index"><div class="child-item" :style="{marginRight: item.children && item.children.length > 1 ? '20px' :''}"><div class="childname" :id="item.id"><div class="shows"><slot :items="item">{{item.name}}</slot></div><div class="position-arrow" v-if="list.length > 1"><i class="el-icon-right"></i></div><div class="position-top" v-if="isFirst(item.id) && domready" :style="position_top(item.id,'top')"></div><div class="position-top" v-if="isLast(item.id)" :style="position_top(item.id,'bottom')"></div></div><div class="childarrow" :style="{borderRight:item.children && item.children.length >1 ? '2px solid #606266' : '3px solid transparent'}"><div :class="item.children && item.children.length<=1?'long-img':''"></div><i class="el-icon-right" v-if="item.children && item.children.length" ></i></div></div><div class="child-children" v-if="item.children && item.children.length"><processJson :list="item.children" ><template v-slot="item"><slot :items='item.items' /></template></processJson></div></div></div></div>
</template><script>
export default {name: "processJson",components: {},data() {return {domready: false,};},props: {list: {type: Array,default: () => [],},},mounted() {this.$nextTick(() => {this.domready = true;});},methods: {position_top(id, position) {let dom = document.getElementById(id);let height;if (dom) {height = dom.clientHeight;}let rt;if (position === "top") {rt = {height: height / 2 - 2 + "px",top: 0,};}if (position === "bottom") {rt = {height: height / 2 + 1 + "px",bottom: 0,};}return rt;},isFirst(id) {return (this.list.length > 1 && this.list.map((x) => x.id).indexOf(id) === 0);},isLast(id) {return (this.list.length > 1 &&this.list.map((x) => x.id).indexOf(id) === this.list.length - 1);},},
};
</script><style lang="scss" scoped>
.el-icon-right{font-weight: 600;
}
.processBox {p {margin: 0;font-size: 13px;}display: flex;.father {width: 70px;background-color: red;padding: 100px 10px;}.childs {.child {display: flex;background-color: #fff;.child-item {display: flex;align-items: center;margin: 10px 0;.childname {.shows {text-align: left;border: 1px solid #b4b4b4;padding: 10px;// height: 100px;width: 100%;box-shadow: 1px 2px 8px #00000033;&:hover{box-shadow: 1px 2px 8px #00000066;}}cursor: pointer;height: 100%;display: flex;align-items: center;text-align: center;justify-content: center;position: relative;padding: 10px 0;.position-arrow {position: absolute;// top: 50%;left: -22px;}.position-top {position: absolute;width: 3px;background-color: #fff;left: -23px;height: 10px;}}.childarrow {height: 100%;// border-right: ;display: flex;align-items: center;}}}.child-children {display: flex;flex-direction: column;justify-content: center;}}.long-img{width: 20px;height: 2px;background-color: #606266;}.icon_arrow {// margin-left: 20px;&:after {width: 30px;height: 1px;background-color: #000;}}
}
</style>
调用
<template><div><josnToProcess :list="list"><template #default="{ items }"><div class="node_item ">{{items.unitName }}</div></template></josnToProcess></div>
</template><script>
import josnToProcess from "./tree-right.vue";
export default {name: "",props: {},components: { josnToProcess },data() {return {list: [{unitName: "长沙供电公司1",id: "1",children: [{unitName: "长沙供电公司1-1",id: "1-1",children: [{unitName: "长沙供电公司1-1-1",id: "1-1-1",},{unitName: "长沙供电公司1-1-2",id: "1-1-2",},],},{unitName: "1-2",id: "1-2",children: [{unitName: "1-2-1",id: "1-2-1",},],},{unitName: "长沙供电公司1-3",id: "1-3",children: [{unitName: "长沙供电公司1-3-1",id: "1-3-1",},{unitName: "长沙供电公司1-3-2",id: "1-3-2",},],},{unitName: "长沙供电公司1-4",id: "1-4",},],},{unitName: "长沙供电公司2",id: "2",},{unitName: "长沙供电公司3",id: "3",children: [{unitName: "长沙供电公司3-1",id: "3-1",children: [{unitName: "长沙供电公司3-1-1",id: "3-1-1",},],},{unitName: "长沙供电公司3-1-2",id: "3-1-2",children: [{unitName: "长沙供电公司3-1-2-1",id: "3-1-2-1",children: [{unitName: "长沙供电公司3-1-2-1-1",id: "3-1-2-1-1",},],},{unitName: "长沙供电公司3-1-2-2",id: "3-3-1-2-2",},],},],},{unitName: "长沙供电公司1-3",id: "4",},],showFields: [//show fields{name: "姓名:",key: "name",},{name: "年龄:",key: "age",},],};},computed: {},watch: {},methods: {},created() {},mounted() {},
};
</script><style scoped lang="scss">
.node_item {width: 230px;height: 116px;
}
</style>