Vue3 遞歸組件

本文簡介

點贊 + 關(guān)注 + 收藏 = 學(xué)會了


在日常 Vue 項目中簿透,大概率會用組件庫輔助開發(fā)铅碍,所以 遞歸組件 的出鏡率可能不會非常高热鞍。但這并不代表 遞歸組件 不重要闷尿。

本文用10分鐘左右的時間讓你掌握 遞歸組件 的用法塑径。

在此之前,你必須掌握:html + css + js + Vue3 基礎(chǔ)用法填具,至少需要知道 Vue 組件 是什么统舀。



用法講解

在講解 遞歸組件 之前,我們需要先了解幾個概念劳景。


什么是遞歸誉简?

遞歸在百度百科里的定義是:

程序調(diào)用自身的編程技巧稱為遞歸( recursion)

你可以將 遞歸 粗略的理解為 循環(huán) ,只不過 遞歸 是調(diào)用自身盟广。

在實際使用中闷串,需要給遞歸設(shè)置一個邊界條件,用該邊界條件來判斷是否繼續(xù)遞歸下去筋量。

如果不設(shè)置判斷條件烹吵,將會導(dǎo)致 無限遞歸 碉熄,也就是 死循環(huán)!


什么是遞歸組件肋拔?

看到這里锈津,我相信大家是知道 Vue組件 是什么。

我先把 《Vue3 遞歸組件 文檔》 放在這凉蜂。

其實 遞歸組件 就是把 “遞歸” 和 “組件” 結(jié)合起來琼梆。

組件在邊界條件內(nèi)不斷調(diào)用自己,直到超出邊界條件為止窿吩。


遞歸組件在哪會用到茎杂?

在我工作中會出現(xiàn)遞歸組件的情況有:

  • “樹”組件:用來展示文件層級的。
  • 左側(cè)導(dǎo)航欄:根據(jù)路由層級生成的導(dǎo)航菜單纫雁。
  • 多級表格(嵌套的表格)蛉顽。



上手實操

經(jīng)過前面的講解,相信大家對 遞歸組件 已經(jīng)有一定的概念了先较。

接下來通過一個簡單的例子來講解携冤。

001.png

上圖就是本次要實現(xiàn)的例子。

我沒有寫樣式闲勺,大家將就一下曾棕,用想象力把這想象成網(wǎng)站的左側(cè)導(dǎo)航欄吧。

這種導(dǎo)航欄菜循,有在前端寫死的翘地;也有寫業(yè)務(wù)是需要后端配置,前端把導(dǎo)航欄數(shù)據(jù)請求回來再生成路由的癌幕。

所以可以理解為前端一開始不知道這個導(dǎo)航有多少層級衙耕。

這時就可以通過 遞歸組件 的方式來實現(xiàn)。


步驟如下:

  1. 創(chuàng)建導(dǎo)航組件
  2. 全局注冊導(dǎo)航組件
  3. 獲取數(shù)據(jù)(本例以學(xué)習(xí)為目的勺远,所以在前端寫死數(shù)據(jù))
  4. 在導(dǎo)航組件中設(shè)置遞歸邊界橙喘,并渲染數(shù)據(jù)


1、創(chuàng)建組件

我給導(dǎo)航組件命名為 RootNav.vue 胶逢。并將它放在 components 目錄下厅瞎。

RootNav.vue

<template>
  <div>
    Rootnav
  </div>
</template>

<script setup>

</script>

<style lang="scss" scoped>

</style>

此時項目目錄如下:

省略部分目錄和文件

- src
|- main.js
|- App.vue
|- components
   |- RootNav.vue


2、全局注冊組件

我在全局注冊 RootNav.vue 組件初坠,這樣就方便 RootNav.vue 自己調(diào)用自己了和簸。

main.js

import { createApp } from 'vue'
import App from './App.vue'
import RootNav from './components/RootNav.vue' // 引入 RootNav 組件

const app = createApp(App)

app.component('RootNav', RootNav) // 將 RootNav 注冊成全局組件

app.mount('#app')


App.vue 中使用

App.vue

<template>
  <div>
    <RootNav />
  </div>
</template>
002.png

此時瀏覽器的界面如上圖所示。


3碟刺、獲取導(dǎo)航數(shù)據(jù)

在真實項目中锁保,左側(cè)導(dǎo)航可能是從后端獲取的。

但本文的目的是學(xué)習(xí)遞歸組件,所以就直接在前端模擬了一份 “請求回來的數(shù)據(jù)”爽柒。

我把 “請求數(shù)據(jù)” 的操作放在 App.vue 吴菠。然后再通過 props 的方式傳入到 RootNav.vue 組件內(nèi)。

講到 props 我就順便提一下:《Vue3 過10種組件通訊方式》


App.vue

<template>
  <div>
    <RootNav :list="navList" />
  </div>
</template>

<script setup>
const navList = [
  {
    name: '一級導(dǎo)航 1'
  },
  {
    name: '一級導(dǎo)航 2',
    children: [
      { name: '二級導(dǎo)航 2-1' },
      {
        name: '二級導(dǎo)航 2-2',
        children: [
          { name: '三級導(dǎo)航 2-2-1' },
          { name: '三級導(dǎo)航 2-2-2' },
        ]
      },
      { name: '二級導(dǎo)航 2-2' }
    ]
  },
  {
    name: '一級導(dǎo)航 3'
  }
]
</script>


RootNav.vue

<template>
  <div>
    RootNav    
  </div>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => []
  }
})
</script>

此時在 RootNav.vue 里就接收到 “請求回來的導(dǎo)航數(shù)據(jù)” 了霉赡。


4、設(shè)置遞歸邊界幔托,并渲染數(shù)據(jù)

我們看到導(dǎo)航數(shù)據(jù)有 children 字段穴亏,這個字段是 “子菜單” 的意思。

我們可以通過是否存在 children 字段來判斷是否需要繼續(xù)遞歸重挑。也就是說嗓化,children 就是遞歸的邊界條件。

RootNav.vue

<template>
  <ul>
    <template v-for="item in list">
      <li>{{ item.name }}</li>
      <RootNav v-if="'children' in item" :list="item.children" />
    </template>
  </ul>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => []
  }
})
</script>

這部分的重點在 HTML 代碼里谬哀。

到這就完成了最開始的目標(biāo)了刺覆。

001.png



完整代碼

main.js

import { createApp } from 'vue'
import App from './App.vue'
import RootNav from './components/RootNav.vue'

const app = createApp(App)

app.component('RootNav', RootNav)

app.mount('#app')


App.vue

<template>
  <div>
    <RootNav :list="navList" />
  </div>
</template>

<script setup>
const navList = [
  {
    name: '一級導(dǎo)航 1'
  },
  {
    name: '一級導(dǎo)航 2',
    children: [
      { name: '二級導(dǎo)航 2-1' },
      {
        name: '二級導(dǎo)航 2-2',
        children: [
          { name: '三級導(dǎo)航 2-2-1' },
          { name: '三級導(dǎo)航 2-2-2' },
        ]
      },
      { name: '二級導(dǎo)航 2-2' }
    ]
  },
  {
    name: '一級導(dǎo)航 3'
  }
]
</script>


components/RootNav.vue

<template>
  <ul>
    <template v-for="item in list">
      <li>{{ item.name }}</li>
      <RootNav v-if="'children' in item" :list="item.children" />
    </template>
  </ul>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => []
  }
})
</script>



推薦閱讀

??《執(zhí)行vue create時到底做了什么》

??《Vue3 過10種組件通訊方式》

??《Vite 搭建 Vue2 項目(Vue2 + vue-router + vuex)》

??《console.log也能插圖》


如果本文對你有幫助,也希望你可以 點贊 關(guān)注 收藏 ~ 這對我很有用 ~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末史煎,一起剝皮案震驚了整個濱河市谦屑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篇梭,老刑警劉巖氢橙,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恬偷,居然都是意外死亡悍手,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門袍患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坦康,“玉大人,你說我怎么就攤上這事诡延≈颓罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵肆良,是天一觀的道長仑撞。 經(jīng)常有香客問我,道長妖滔,這世上最難降的妖魔是什么隧哮? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮座舍,結(jié)果婚禮上沮翔,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好采蚀,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布疲牵。 她就那樣靜靜地躺著,像睡著了一般榆鼠。 火紅的嫁衣襯著肌膚如雪纲爸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天妆够,我揣著相機與錄音识啦,去河邊找鬼。 笑死神妹,一個胖子當(dāng)著我的面吹牛颓哮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸵荠,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冕茅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛹找?” 一聲冷哼從身側(cè)響起姨伤,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庸疾,沒想到半個月后姜挺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡彼硫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年炊豪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拧篮。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡词渤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出串绩,到底是詐尸還是另有隱情缺虐,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布礁凡,位于F島的核電站高氮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顷牌。R本人自食惡果不足惜剪芍,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窟蓝。 院中可真熱鬧罪裹,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至峡继,卻和暖如春冯袍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碾牌。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工康愤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人小染。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓翘瓮,卻偏偏與公主長得像贮折,于是被迫代替她去往敵國和親裤翩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

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