Vue2遞歸組件實(shí)現(xiàn)樹形菜單
今天看了老長(zhǎng)時(shí)間遞歸組件,官方給的教程太簡(jiǎn)便了,根本看不出到底怎么用。于是自己查網(wǎng)摸索了一下,這兒只把核心思想寫出來。
效果如下圖,點(diǎn)擊后打開二級(jí)菜單,再點(diǎn)擊后打開三級(jí)。

//js
//引子
//思想:當(dāng)v-if=‘false'時(shí),循環(huán)時(shí)進(jìn)行的。所以一開始就設(shè)置為false。
ggg:{
name:'gs',
template:`
<div>
<p @click.stop='show=!show'>我是p標(biāo)簽</p>
//這兒show必須要初始值為false,不然就是堆棧溢出,死循環(huán)。
<gs v-if='show' ></gs>
//這個(gè)是循環(huán)組件。命名后當(dāng)函數(shù)使。
</div>
}
由于每次遞歸組件,就相當(dāng)于實(shí)例化了一次組件。所有寫在組件data中的值都是該組件專屬的。
樹狀結(jié)構(gòu):
我們?cè)诟附M件給出一個(gè)數(shù)據(jù),子組件調(diào)用這個(gè)數(shù)據(jù),然后子組件的子組件調(diào)用它父組件的數(shù)據(jù),如此循環(huán)下去。只要數(shù)據(jù)結(jié)構(gòu)相同,他們調(diào)用的方法相同,就行的通。當(dāng)最后沒有子組件的時(shí)候,
它不會(huì)報(bào)錯(cuò),這個(gè)應(yīng)該是被vue優(yōu)化了。
思想:遞歸調(diào)用某個(gè)組件,而這個(gè)組件的作用就是解析出此層的數(shù)據(jù)。因此數(shù)據(jù)的格式就有技巧:
msg:[{//對(duì)此數(shù)組遍歷。
js
text:1, //第一層數(shù)據(jù) ,要顯示1,就要對(duì)頂層text遍歷,xxx.text就得到1。
//點(diǎn)擊‘1'彈出1-1就需要將父組件的xxx.next傳給子組件。
next:[{
text:'1-1',//第二層數(shù)據(jù)
next:[{
text:'1-1-1',//第三層數(shù)據(jù)
next:[{
text:'1-1-1-1',
}]
}]
}]
},{
text:2, //第一層數(shù)據(jù)
},{
text:3, //第一層數(shù)據(jù)
}]
//html
<div>
<ggg :msg='msg'></ggg> //這兒寫在父組件模板中。
</div>
//js
ggg:{
name:'gs',// 這兒必須起個(gè)名字,這個(gè)名字其實(shí)就是構(gòu)造函數(shù)的名字。沒有名字無法遞歸組件。
template:`// 構(gòu)造函數(shù)的return值,模板。
<ul >
<li v-for='a in text'>
{{a.text}}//第一次1、2、3;第二次 1-1 ,第三次1-1-1,第四次1-1-1-1
<gs :msg='a.next'></gs> // 這兒遞歸用組件(構(gòu)造函數(shù)),代碼運(yùn)行到這兒時(shí)會(huì)返回去調(diào)用。這兒有個(gè)很重要的操作,將這一層的a.text數(shù)據(jù)傳到下一層去,并且改為text
</li>
</ul>`,
props:['msg'],//這個(gè)是接收父組件過的值
}
到此基本概念已經(jīng)齊全了。
點(diǎn)擊1 出現(xiàn)1-1:
<li v-for='a in msg' @click.stop.self='show=!show'>// 在li標(biāo)簽添加一個(gè)點(diǎn)擊事件,改變show的值。
{{a.text}}
<gs :msg='a.next' v-if='show' ></gs>
//官網(wǎng)上說了,這兒是show為true才會(huì)遞歸。就是解析下一次數(shù)據(jù)。
</li>
點(diǎn)擊1想出現(xiàn)1-2:修改data的值,從頂層數(shù)據(jù)出現(xiàn)1 2 3可以推斷出來。
全代碼:
<template >
<div>
<ggg :msg='msg'></ggg> //組件使用 父組件傳msg 子組件接收(:msg)
</div>
</template>
<script>
export default { //這兒用的腳手架,若是普通文件,這兒就是new Vue({})
data(){
return {
msg:[{
text:1,
next:[{
text:'1-1',
next:[{
text:'1-1-1',
next:[{
text:'1-1-1-1',
}]
}]
},{
text:'1-2' //1-2寫在這兒,第二層數(shù)據(jù)數(shù)組中的a[1].text就是‘1-2'
}]
},{
text:2,
},{
text:3,
}]
}
},
components:{
ggg:{
name:'gs',
template:`
<ul >
<li v-for='a in msg' @click.stop.self='show=!show'>
{{a.text}}
<gs :msg='a.next' v-if='show' ></gs>
</li>
</ul>`,
props:['msg'],
data(){
return {
show:false
}
}
}
}
}
</script>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3自動(dòng)引入組件與組件庫(kù)的方法實(shí)例
關(guān)于vue?組件還是非常好用的,真正掌握預(yù)計(jì)需要一段時(shí)間,下面這篇文章主要給大家介紹了關(guān)于Vue3自動(dòng)引入組件與組件庫(kù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
利用Vue3和element-plus實(shí)現(xiàn)圖片上傳組件
element-plus提供了uploader組件,但是不好定制化。所以本文將利用Vue3和element-plus實(shí)現(xiàn)一個(gè)圖片上傳的組件,感興趣的可以了解一下2022-03-03
vue實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
vue中$set的使用(結(jié)合在實(shí)際應(yīng)用中遇到的坑)
這篇文章主要介紹了vue中$set的使用(結(jié)合在實(shí)際應(yīng)用中遇到的坑),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Vue中computed屬性和watch,methods的區(qū)別
本文主要介紹了Vue中computed屬性和watch,methods的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
TypeError:res.forEach?is?not?a?function報(bào)錯(cuò)解決辦法
這篇文章主要給大家介紹了關(guān)于TypeError:res.forEach?is?not?a?function報(bào)錯(cuò)的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-07-07

