后端返回的数据是树的结构,这个结构嵌套的层数不一定多少层数。
咱们本文章里的内容和element,iview等里面的tree组件一样的。element,iview等里面的tree组件扩展性不好,不如自己写一个。来满足自己需求。
代码难度等级:★★★☆☆(三颗星)
代码介绍:
封装了两个组件,一个父组件simplTree.vue,一个子组件simplTreeChild.vue,在使用的时候我们直接调用父组件<simplTree :data="treeData" ref="simplTree" :clickEvent="selectObject"></simplTree>
绑定数据和事件。 最重要的地方是子组件里面的写法,自己调用自己(递归算法)。我在子组件里面注释标注了。
递归算法案例:https://blog.csdn.net/qq_38946996/article/details/109218623?spm=1001.2014.3001.5501
递归算法案例入口
树的父组件
<template>
<div class="simplTree">
<div
class="TreeBox"
v-if="nodes && nodes.length"
>
<Child
v-for="(item,index) in nodes"
:nodeData="item"
:key="'simplTree_' + index"
:selectObject="selectObject"
:onSelectObject="onSelectObject"
:clickEvent="clickEvent"
:Level="0"
></Child>
</div>
</div>
</template>
<script>
import Child from './simplTreeChild'
export default {
props: ['data', 'clickEvent'],
data() {
return {
nodes: [],
selectObject: null,
}
},
watch: {
data(newValue) {
this.nodes = [];
this.$nextTick(() => {
setTimeout(() => {
this.nodes = newValue;
}, 0)
})
},
},
components: { Child },
methods: {
onSelectObject(event) {
this.selectObject = event;
},
}
}
</script>
<style>
</style>
树的子组件
<template>
<div class="simplTreeChild">
<div
class="simplTreeChild-config-title"
:class="{'active' : isSelect}"
:style="{'padding' : '0 0 0 ' + (20 * Level) + 'px'}"
@click.stop="clickEventActive(nodeData)"
>
<div
class="icon"
:style="{'transform': (show ? 'rotateZ(0deg)' : 'rotateZ(-90deg)') }"
@click.stop="show = !show;"
>
<Icon type="md-arrow-dropdown" />
</div>
<div class="title" :title="nodeData.Name" :style="{width:( 314 - 70 - (20 * Level))+'px' }">{{nodeData.Name}}</div>
</div>
<transition name="fade">
<!-- 这里是关键,dom层循环调用,一直到children长度等于0 -->
<div class="simplTreeChild-children" v-show="show">
<simplTreeChild
v-for="(item,index) in nodeData.children"
:nodeData="children"
:key="'simplTree_' + index"
:selectObject="selectObject"
:onSelectObject="onSelectObject"
:clickEvent="clickEvent"
:Level="Level+1"
></simplTreeChild>
</div>
</transition>
</div>
</template>
<script>
export default {
props: ['nodeData', 'clickEvent', 'selectObject', 'onSelectObject', "Level"],
name: 'simplTreeChild',
data() {
return {
show: false,
isSelect: false,
}
},
watch: {
selectObject(newVal) {
if (newVal === this) {
this.isSelect = true;
} else {
this.isSelect = false;
}
}
},
methods: {
clickEventActive(nodeData) {
this.clickEvent(nodeData);
this.onSelectObject(this);
},
}
}
</script>
组件的使用
<template>
<div class="scenConfig">
<simplTree :data="treeData" ref="simplTree" :clickEvent="selectObject"></simplTree>
</div>
</template>
<script>
import simplTree from "./component/simplTree.vue"
export default {
components: { simplTree },
data() {
return {
treeData: []
}
},
created() {
this.GetTree()
},
methods: {
// 获取树的数据
GetTree() {
Api.getData().then(res => {
this.treeData= res.treeData;
})
},
// 选定某一树节点
selectObject(obj) {
// 方法区
}
}
}
</script>
<style lang="less" scoped>
.scenConfig { }
</style>
版权声明:本文为qq_38946996原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。