VUE遞歸樹形實現多級列表

本文實例為大傢分享瞭VUE遞歸樹形實現多級列表,供大傢參考,具體內容如下

什麼是遞歸?

簡單來說就是在組件中內使用組件本身。

為什麼要用遞歸?

如果出現很多下拉菜單,同級,分級數據,層級混雜,可以使用v-for的嵌套循環不就完事瞭。對,沒毛病這樣的話也可以做,但是如果數據又多加瞭【很多】級分類呢;使用v-for也能實現,但是代碼可能會比較雜或混亂!也不適合後期的維護,這個時候呢,我們就可以使用我們所說道的【遞歸組件 】瞭,使用遞歸組件,無論你的數據怎麼增加我們都不用改動我們的代碼。

先看效果:

1、創建兩個文件

父組件tree.vue 子組件tree-detail

父組件代碼:

<template>
    <div id="tree">
        <treedetail
       :title="list.name"    //把值傳給子組件
       :list="list.children" //把值傳給子組件
        :num='0'
        >
        </treedetail>
    </div>
</template>
<script>

/**
 * 模擬一個樹形結構圖
 */
const list = {
  name: "電子產品",
  children: [
    {
      name: "電視",
      children: [
        {
          name: "philips",
          children: [
            { name: "philips-A" },
            { name: "philips-B" },
            { name: "philips-C" }
          ]
        },
        {
          name: "Tcl",
          children: [
            { name: "Mac Air" },
            { name: "Mac Pro" },
            {
              name: "ThinlPad",
              children: [
                {
                  name: "ThinlPad-A",
                  children: [
                    { name: "ThinlPad-A-a" },
                    { name: "ThinlPad-A-b" },
                    { name: "ThinlPad-A-c" }
                  ]
                },
                { name: "ThinlPad-B" },
                { name: "ThinlPad-C" },
                { name: "ThinlPad-D" }
              ]
            }
          ]
        },
        { name: "海興" }
      ]
    },
    {
      name: "電腦",
      children: [{ name: "acer" }, { name: "聯想" }, { name: "惠普" }]
    },
    {
      name: "可穿戴的設備",
      children: [
        {
          name: "手環",
          children: [
            { name: "華為B5手環" },
            { name: "小米手環" },
            { name: "iphone手環" }
          ]
        }
      ]
    }
  ]
};
import treedetail from '../tree/treedetail' 
export default{
    name:'tree',
    data(){
        return{list}
    },
    components:{treedetail}  //註冊子組件
}
</script>

子組件代碼:

<template>
<div id="treedetail" >
    <div class="treedetail" @click="btn()" :style="indent">  //btn是用來切換顯示隱藏
        <span>{{flag ? '-' :'+'}}</span> 
        <span>{{title}}</span> //接收到的標題
        </div>  
     <div  v-if="flag">  //這裡加顯示隱藏也是必要的
        <treedetail  //treedetail這裡的命名要跟父組件註冊子組件名稱一樣,不然無法顯示。DIV就無法顯示
        v-for="(item,index) in list" 
        :key="index"
        :title="item.name"
        :list='item.children'  //渲染列表下的列表數據
        :num='num + 1' //這裡的作用應該是分清層級。
        ></treedetail>
    </div>   
  
    </div>
</template>
<script>
export default {
    name:'treedetail',
    props:{
        title:{
            type:String,
            default:'名稱'
        },
        list:{type:Array},
        num:{
            type:Number,
            default:0
        }
    },
    data(){
        return{
            flag:false
        }
    },
    methods:{
        btn(){
            this.flag=!this.flag
        }
    },
    computed:{
        indent(){
            return `transform: translate(${this.num*20}px)`; 
        
            
        }
    }

}
</script>

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: