

1.JSON数据
[
{
label: "一级 1",
children: [
{
label: "二级 1-1",
children: [
{
label: "三级 1-1-1",
},
],
},
],
},
{
label: "一级 2",
children: [
{
label: "二级 2-1",
children: [
{
label: "三级 2-1-1",
children: [
{
label: "四级 2-1-1-1",
},
]
},
],
},
{
label: "二级 2-2",
children: [
{
label: "三级 2-2-1",
},
],
},
],
},
{
label: "一级 3",
children: [
{
label: "二级 3-1",
children: [
{
label: "三级 3-1-1",
},
],
},
{
label: "二级 3-2",
children: [
{
label: "三级 3-2-1",
},
],
},
],
}
]
2.tree.vue
<template>
<div class="json-tree">
<json-tree
v-for="(item, index) in data"
:key="index"
:node="item"
></json-tree>
</div>
</template>
<script type="text/jsx">
import JsonTree from "./jsonTree";
export default {
components: {
"json-tree": JsonTree,
},
data() {
return {
data: [
{
label: "一级 1",
children: [
{
label: "二级 1-1",
children: [
{
label: "三级 1-1-1",
},
],
},
],
},
{
label: "一级 2",
children: [
{
label: "二级 2-1",
children: [
{
label: "三级 2-1-1",
children: [
{
label: "四级 2-1-1-1",
},
]
},
],
},
{
label: "二级 2-2",
children: [
{
label: "三级 2-2-1",
},
],
},
],
},
{
label: "一级 3",
children: [
{
label: "二级 3-1",
children: [
{
label: "三级 3-1-1",
},
],
},
{
label: "二级 3-2",
children: [
{
label: "三级 3-2-1",
},
],
},
],
},
],
num: 0,
};
},
mounted() {
this.deepList(this.data);
},
methods: {
deepList(list) {
var that = this;
list.filter(v => {
if (v.children) {
that.num++;
that.$set(v, "level", that.num);
that.deepList(v.children);
}else{
that.$set(v, "level", (that.num+1));
that.num = 0;
}
});
}
},
};
</script>
3.jsonTree.vue
<template>
<div class="json-tree-node">
<div class="json-tree-node__content" :style="{ 'margin-left':(node.level * 15) + 'px' }">
<node-content :node="node"></node-content>
</div>
<div class="json-tree-node__children">
<json-tree
v-for="(item,index) in node.children"
:key="index"
:node="item">
</json-tree>
</div>
</div>
</template>
<script type="text/jsx">
export default {
name:'JsonTree',
componentName: 'JsonTree',
props:{
node:{
default(){
return {}
}
}
},
components:{
NodeContent:{
props:{
node:{
require:true
}
},
render(h){
const node = this.node;
return (<span>{node.label}</span>)
}
}
}
}
</script>
<style scoped>
</style>