vue实现树形tree组件

一.实现效果 ​​​​

在这里插入图片描述

二.json数据格式展示
在这里插入图片描述

三.实现效果
1.点击时箭头(👉到👇)的改变
2.最后一层时无箭头且输出json数据中对应value值 四.实现思路
1.父组件调用子组件,并给子组件传json
2.自定义组件(子组件)用于属性结构展示
3.子组件的自我调用

四.代码实现 父组件app.vue

<template>	
  <div class = 'courseInfo'>
  	<!--my-tree即自定义的组件,冒号即v-bind属性绑定-->
    <my-tree :data="jsonyz"/> 
  </div>
</template>
<script>
import MyTree from "./my_tree.vue" //引入子组件
export default {
	components:{
		'my-tree':MyTree,     //声明子组件
	},
  data() {
    return {
      name: 'App',
      jsonyz :{
				"1.1 集合与集合的表示方法": {
					"1.1.1 集合的概念": {
						"集合的含义": 25002,
						"元素与集合关系的判断": 25003,
						"集合的确定性、互异性、无序性": 25004
					},
					"1.1.2 集合的表示方法": {
						"集合的表示法": 25006
					}
				},
				"1.2 集合之间的关系与运算": {
					"1.2.1 集合之间的关系": {
						"子集与真子集": 25007,
						"集合的包含关系判断及应用": 25008,
						"集合中元素个数的最值": 25010,
						"空集的定义、性质及运算": 25011,
						"集合关系中的参数取值问题": 25012
					},
					"1.2.2 集合的运算": {
						"并集及其运算": 25013,
						"交集及其运算": 25014,
						"补集及其运算": 25015,
						"全集及其运算": 25016,
						"交、并、补集的混合运算": 25017,
						"子集与交集、并集运算的转换": 25018,
						"Venn图表达集合的关系及运算": 25019
					}
				},
				"1.3  提升": {
					"1.3.1 提升": {
						"集合中的典型问题分析": 38059,
						"子集问题": 38060,
						"集合的综合问题1": 38061,
						"集合的综合问题2": 38062
					}
				}
			}			
    }
  },
  methods: {},
 }
</script>
<style>
</style>

子组件my_tree.vue

<template>  
    <div>
        <!--逐层循环json对象,记得绑定的key只能是number/string类型,不能为对象类型-->
        <div v-for="(value,key,index) in data" :key="index">
            <!--鼠标点击事件给openIndex赋值,更改open布尔值,并判断value是否为对象类型-->
            <span style="color:red;" @click="openChildList(index,value)">{{key}}
                <span>
                    <!--判断箭头显示-->    
                    <i style="font-size: 18px;" class="el-icon-arrow-down" v-if="openIndex ==index && open == true&&isObj(value)"></i>
                    <i style="font-size: 18px;" class="el-icon-arrow-right" v-else-if="isObj(value)"></i>
                </span>
            </span>
            <div v-if="openIndex==index&&open" style="margin-left:20px">
                <div v-if="isObj(value)">
                    <!--***自我调用***-->
                    <my-tree :data="value"/
                ></div>
            </div>
        </div>
  </div>
</template>
<script>
export default {
    name:'myTree',
    //接收父组件传过来的值
    props:['data'],
    data(){
        return {
            open:false,
            openIndex:-1   //0
        }
    },
    methods:{
        openChildList(openIndex,value){
            if(this.openIndex ==openIndex && this.open == true){
                this.open = false;
            }else{
                this.openIndex = openIndex;
                this.open = true;
            }
            if(!this.isObj(value)){
                console.log(value);
            }
        },
        isObj(o){
            return typeof(o) == 'object';
        },
    }
}
</script>
<style>
</style>

五.涉及
1.父子组件传值
2.自定义组件
3.组件的自我调用
4.Json的解析
5.目录问题:./当前文件所在目录;…/父文件所在目录;/根目录

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章