遞歸組件的實現(xiàn)原理

最近在開發(fā)一個小模塊,碰到了這么一個需求: 在一個頁面中顯示一級分類纤壁,當一級分類有子類的話,點開一級分類捺信,展現(xiàn)二級分類酌媒,假設(shè)二級分類中的個別某一項有屬于他的子分類的時候,點開他迄靠,繼續(xù)顯示它的子分類秒咨。上面所說的每級分類中,子分類數(shù)目可能是一項或者多項掌挚,數(shù)目不固定雨席,具體看返回來的數(shù)據(jù)有多少。

我擦嘞吠式,這個不就是遞歸么陡厘。抽米。。糙置。云茸。。然而谤饭,在vue中查辩,官方是不推薦直接操作dom樹的,因為這樣會非常損耗性能网持。宜岛。。功舀。這樣一來萍倡,直接操作dom樹這個想法就只能丟棄了。辟汰。列敲。這可如何是好呢?于是帖汞,我就開始度娘了戴而。。翩蘸。所意。然后度到在官網(wǎng)里有遞歸組件這么一回事,但也僅限于介紹催首,其它特么的什么也木有扶踊,但是說了最重要的一點,一定要有name屬性郎任,因為這個name屬性指代的就是組件本身秧耗。。舶治。然后我就接著找啊找啊分井,找到了一篇不錯的博文,具體鏈接地址: https://www.cnblogs.com/ychl/p/6075106.html 霉猛。不錯的一篇文章尺锚,不過個人感覺可以再細化點,于是經(jīng)過博主同意韩脏,進行二次個人解讀缩麸。 有朋友就納悶了:你咋那么懶铸磅。赡矢。杭朱。。我想說吹散,一切為了項目弧械,這可不是個人業(yè)余學習時間,我也是現(xiàn)在有點時間空民,怕以后忘記了刃唐,趕緊記起來,避免以后掉鏈子界轩。

我們上面說到了画饥,我們的遞歸應(yīng)該是按照數(shù)據(jù)來的。廢話浊猾,你如果沒有子類抖甘,你遞歸的毛線啊,所以葫慎,一切以數(shù)據(jù)為準衔彻。請看下面的一些列數(shù)據(jù),來自于隔壁家的老黃的 文章 : https://www.cnblogs.com/ychl/p/6075106.htmlvuejs學習--遞歸組件(樹型表格分享)


vardata = [{
                "id": "1",
                "data": {
                    "menuName": "項目管理",
                    "menuCode": "",
                },
                "childTreeNode": [{
                    "data": {
                        "menuName": "項目",
                        "menuCode": "BusProject",
                    },
                    "childTreeNode": []
                }, {
                    "data": {
                        "menuName": "我的任務(wù)",
                        "menuCode": "BusProject",                                                                              },
                    "childTreeNode": []
                }, {
                    "data": {
                        "menuName": "人員周報",
                        "menuCode": "BusProject",
                    },
                    "childTreeNode": []
                }]
            }, {
                "id": "2",
                "data": {
                    "menuName": "數(shù)據(jù)統(tǒng)計",
                    "menuCode": "BusClock",
                },
                "childTreeNode": []
            }, {
                "id": "3",
                "data": {
                    "menuName": "人事管理",
                    "menuCode": "",
                },
                "childTreeNode": []
            }, {
                "id": "4",
                "data": {
                    "menuName": "基礎(chǔ)管理",
                    "menuCode": "",
                },
                "childTreeNode": []
            }]

朋友們上面看到了偷办,數(shù)據(jù)data是一個數(shù)組艰额,數(shù)組里面有好幾項數(shù)據(jù),所以我們第一步想到的是用 v-for這個指令椒涯,將數(shù)據(jù)一個個都給for出來柄沮,于是咱們說干就干。
大家對于上面的這個代碼應(yīng)該多少能看懂废岂,我覺得唯一有疑問的應(yīng)該是 為啥v-for 仍在了 ul 這個標簽上了呢铡溪。這里我這么解釋。我們的數(shù)組中(拿一級的舉例你就懂了)泪喊,每個數(shù)據(jù)都是一項棕硫,然而這每一項我們不知道它到底是有子分類的還是沒有子分類的,這個不是我們說了算袒啼,而是通過接口獲取到的數(shù)據(jù)說了算哈扮。那么,這一項到底有沒有子分類就無法判斷蚓再。這樣的話滑肉,我們的每一項應(yīng)該都是一個ul。

我們這么分析摘仅,假設(shè)我們的分類沒有子項靶庙,那么屬于它的那個ul中的第一個li只要顯示它對應(yīng)的數(shù)據(jù)就好啦,就像下面

    {{model.data.menuName}}

這是不是很簡單呀

情況二娃属,假設(shè)我們循環(huán)到的那一項有子類六荒,也就是對象中的childTreeNode有數(shù)據(jù)护姆,那么這個時候,我們是不是就應(yīng)該把這些數(shù)據(jù) '遞歸出來' 了呢掏击,并且遞歸在屬于它的那一級菜單下面卵皂。重點來了,這可怎么把它遞歸出來呢砚亭?

思路:我們應(yīng)該有第二個列表項灯变,專門用于判斷它的childNodes中有沒有對應(yīng)的數(shù)據(jù),假設(shè)沒有捅膘,啥也不做添祸,這點毋庸置疑。假設(shè)有寻仗,那么想辦法膝捞,自己調(diào)用自己,把childNodes屬性中的數(shù)據(jù)重新傳入我們的組件當中愧沟,讓它根據(jù)新的數(shù)據(jù)遍歷出來J咭А!沐寺!

文字太潦草林艘,我畫了張圖

子類屬性child變成了childTreeNode,data變成dataList什么的不要去糾結(jié)混坞,都是一樣的東西狐援,只是變名稱而已,請重點看我的紅線以及我標注的文字究孕。

image

在圖中你們可以看到啥酱,有個tree組件,他就是我們的遞歸組件了厨诸。你隨便瞟一眼镶殷,有沒有發(fā)現(xiàn)很簡單,不就是我上面說的那個東西嗎微酬。然而你可能發(fā)現(xiàn)了绘趋,我在父組件teamoutput中引用了它,并且將數(shù)據(jù)傳到了他的model屬性颗管。

*****在顯示完對應(yīng)數(shù)據(jù)之后陷遮,下面又有個ul標簽,并且這個ul標簽垦江,把我們對應(yīng)的childTreeNode屬性中的數(shù)據(jù)帽馋,給傳進去了。更加重要的是,這個組件items就是組件tree本身绽族,也就是說姨涡,我們在這里自己調(diào)用了自己,也就是遞歸了项秉。我們是隨便去遞歸的么绣溜?當然不是慷彤。我們在決定遞歸之前娄蔼,先去用計算屬性去判斷了childTreeNode屬性是否有子類數(shù)據(jù),當它有的時候底哗,我們踩決定將數(shù)據(jù)傳入岁诉,實現(xiàn)遞歸,不然的畫跋选,它的v-if是false涕癣,那么就不會顯示。

講到這里前标,我相信各位心里都有點BS了吧坠韩。

希望我的講解對你有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炼列,一起剝皮案震驚了整個濱河市只搁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俭尖,老刑警劉巖氢惋,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稽犁,居然都是意外死亡焰望,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門已亥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熊赖,“玉大人,你說我怎么就攤上這事虑椎★啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵绣檬,是天一觀的道長足陨。 經(jīng)常有香客問我,道長娇未,這世上最難降的妖魔是什么墨缘? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上镊讼,老公的妹妹穿的比我還像新娘宽涌。我一直安慰自己,他們只是感情好蝶棋,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布卸亮。 她就那樣靜靜地躺著,像睡著了一般玩裙。 火紅的嫁衣襯著肌膚如雪兼贸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天吃溅,我揣著相機與錄音溶诞,去河邊找鬼。 笑死决侈,一個胖子當著我的面吹牛螺垢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赖歌,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼枉圃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庐冯?” 一聲冷哼從身側(cè)響起孽亲,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肄扎,沒想到半個月后墨林,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡犯祠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年旭等,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衡载。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡搔耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痰娱,到底是詐尸還是另有隱情弃榨,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布梨睁,位于F島的核電站鲸睛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坡贺。R本人自食惡果不足惜官辈,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一箱舞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拳亿,春花似錦晴股、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹅经,卻和暖如春寂呛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞬雹。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工昧谊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刽虹,地道東北人酗捌。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像涌哲,于是被迫代替她去往敵國和親胖缤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,841評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理阀圾,服務(wù)發(fā)現(xiàn)哪廓,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 我躺在我寢室的床上初烘,聽外面午夜十二點以后依然悶熱的夏季的風的聲音涡真,體會的中國北方在這個時間段熱到離譜的接近四...
    50ml閱讀 138評論 2 1
  • 第一眼看到這個封面的時候,我的內(nèi)心是充滿了拒絕的…畢竟它的封面肾筐,簡直就是熱門成功學書籍的標配岸吡稀!所以估計就算每天去...
    RAINSTOP的游樂場閱讀 449評論 0 0
  • 想找一個談?wù)勑睦镌挼娜寺痤恚瑳]有东亦,因為我沒有前度。
    幸運的蝌蚪閱讀 577評論 0 1