最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue遞歸組件+Vuex開(kāi)發(fā)樹(shù)形組件Tree--遞歸組件的簡(jiǎn)單實(shí)現(xiàn)

 更新時(shí)間:2019年04月01日 10:04:38   作者:fengyangyang  
這篇文章也是我自己開(kāi)發(fā)的從無(wú)到有的過(guò)程,所以它可以為你提供一些Tree組件開(kāi)發(fā)的思路,本文重點(diǎn)給大家介紹vue遞歸組件的簡(jiǎn)單實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧

寫(xiě)在前面

首先,本篇文章所開(kāi)發(fā)的組件并非一個(gè)已經(jīng)開(kāi)源的上線組件,所以如果你急于需要一個(gè)插件來(lái)只做你的項(xiàng)目,那么并不能帶給你及時(shí)的幫助。這個(gè)組件的開(kāi)發(fā)預(yù)計(jì)寫(xiě)兩篇文章,一遍寫(xiě)組件,一篇寫(xiě)組件邏輯。這篇文章也是我自己開(kāi)發(fā)的從無(wú)到有的過(guò)程,所以它可以為你提供一些Tree組件開(kāi)發(fā)的思路,代碼寫(xiě)到一定程度,不能完全依賴插件了,有時(shí)間可以看看插件源碼或者動(dòng)手去開(kāi)發(fā),這樣真的能加深對(duì)技術(shù)的掌握程度。

開(kāi)發(fā)過(guò)程

1.數(shù)據(jù)倉(cāng)庫(kù)-Vuex

2.組件的循環(huán)創(chuàng)建-遞歸組件

需求決定了我的技術(shù)選型,項(xiàng)目需求是一個(gè)中國(guó)各級(jí)政府列表的選擇,后臺(tái)基于大數(shù)據(jù)去匯總各級(jí)政府網(wǎng)站的文章決策,然后交給前端去展示,左側(cè)顯示各級(jí)政府的Tree,右側(cè)顯示具體文章。因?yàn)檎當(dāng)?shù)據(jù)的不確定性,所以顯示政府的Tree的每一層級(jí)也是動(dòng)態(tài)獲取的,就比如北京市下級(jí)的海淀區(qū)政府在一小時(shí)前可能不存在某某政策文章,那么北京市節(jié)點(diǎn)的子節(jié)點(diǎn)中就不會(huì)包含海淀區(qū)這一子節(jié)點(diǎn),但是10分鐘前網(wǎng)站發(fā)布了一篇文章,那么就需要在北京市中添加海淀區(qū),為了良好的實(shí)時(shí)性效果,每一級(jí)的子節(jié)點(diǎn)都不固定。

因此 樹(shù)狀結(jié)構(gòu)的data是變化的而不是在初始化的時(shí)候就固定好 的,數(shù)據(jù)驅(qū)動(dòng)Dom的思想,data有多少層級(jí),Dom就有多少層級(jí),data不定,所以Dom也無(wú)法提前定義好層級(jí),決定采用Vue的遞歸組件,組件遞歸自身實(shí)現(xiàn)無(wú)限制層級(jí)的渲染。需求中每一個(gè)節(jié)點(diǎn)的Tree都具有增刪改的功能,因?yàn)閐ata是單例的,全局維護(hù)著一個(gè)data數(shù)據(jù)源頭,增刪改也就是操作data第n個(gè)子節(jié)點(diǎn)的某個(gè)子元素,因此采用了Vuex作為一個(gè)data存放的倉(cāng)庫(kù)( 這不是一個(gè)組件庫(kù),只是一個(gè)項(xiàng)目的應(yīng)用 )。

項(xiàng)目的關(guān)鍵點(diǎn):

1.動(dòng)態(tài)加載子節(jié)點(diǎn),也就是說(shuō)頁(yè)面加載的時(shí)候,根節(jié)點(diǎn)的 nodes 子節(jié)點(diǎn)數(shù)組可能是個(gè)空數(shù)組,每次單擊節(jié)點(diǎn)去獲取子節(jié)點(diǎn)數(shù)組。

2.全局單例的樹(shù)節(jié)點(diǎn)對(duì)象 data 對(duì)象,每次得到新的子節(jié)點(diǎn),需要去維護(hù)這個(gè)對(duì)象,因?yàn)閿?shù)據(jù)與dom動(dòng)態(tài)綁定,所以每次數(shù)據(jù)對(duì)象內(nèi)部發(fā)生了變化,dom也會(huì)重繪。

vue對(duì)虛擬dom的映射通過(guò)使用diff算法進(jìn)行了優(yōu)化,所以不用擔(dān)心,重繪造成頁(yè)面閃屏

樹(shù) data 數(shù)據(jù)結(jié)構(gòu)如下:

let data = {
 id: "01",
 lable: "政府機(jī)構(gòu)",
 nodes: [
  {
  id: "02",
  lable: "中央機(jī)關(guān)",
  nodes: [{
   //..
  }]
  },
  {
  id: "03",
  lable: "直轄市",
  nodes: [{
   //..
   //北京市...
   //天津市..
  }]
  },
 ]
 };

顯示成這樣:


每一個(gè)節(jié)點(diǎn)包含id,label,nodes三個(gè)屬性,nodes往下延伸子節(jié)點(diǎn),一共有多少級(jí)不確定根據(jù)后臺(tái)獲取得到。

遞歸組件

一個(gè)簡(jiǎn)單的遞歸組件的示例如下:

<template>
 <div class="tree-menu">
 //組件內(nèi)部不斷用自身,只要子節(jié)點(diǎn)存在就遞歸調(diào)用
 <tree-menu v-for='(item, index) of dataNodes' :key='index'></tree-menu>
 </div>
</template>

<script>
export default {
 name:'TreeMenu',//組件名稱必須寫(xiě)
 data() {
 return {
  dataNodes: {
  //...
  }
 }
 }
}
</script>

TreeMenu.vue聲明組件TreeMenu,并向外暴露,在組件內(nèi)部調(diào)用自身,也就是一個(gè)遞歸的思想,綁定的dataNodes有多少層級(jí),那就會(huì)遞歸多少層,因?yàn)槊恳粚佣加衯-for都會(huì)循環(huán)子節(jié)點(diǎn)。綁定具體數(shù)據(jù)的時(shí)候再具體分析。不斷調(diào)用自身,當(dāng)然這只是一個(gè)例子,實(shí)際情況還要改造一下:

新建TreeMenu.vue,作為顯示節(jié)點(diǎn)的邏輯組件:

<template>
 <div class="tree-menu">
 <div>{{label}}</div>//節(jié)點(diǎn)名稱
 <tree-menu //如果nodes.length>0就遞歸顯示子節(jié)點(diǎn)
  v-for="(node, index) of nodes" 
  :key="index" 
  :nodes="node.nodes" //子節(jié)點(diǎn)的子節(jié)點(diǎn)向下傳遞
  :label="node.label"
 >
 </tree-menu>
 </div>
</template>

<script>
export default {
 name: "TreeMenu",
 props:['label','nodes'],//數(shù)據(jù)通過(guò)pros向下傳遞,全局唯一數(shù)據(jù)源
 data() {
 return {}; 
 }
};
</script>

創(chuàng)建Tree.vue作為節(jié)點(diǎn)樹(shù)的入口:

<template>
 <div class="tree-alone">
 <tree-menu :label="tree.label" :nodes="tree.nodes"></tree-menu>
 </div>
</template>
<script>
 import TreeMenu from './TreeMenu.vue'
 export default {
 name: 'tree',
 data() {
  return {
   tree: {
   id: "01",
   lable: "總層級(jí)",
   nodes: [
    {
    id: "02",
    label: "層級(jí)1",
    nodes: [{
     label: '層級(jí)1-1'
    }]
    },
    {
    id: "03",
    label: "層級(jí)2",
    nodes: []
    },
   ]
   };
 }
  }
 },
 components: {
  TreeMenu
 }
 }
</script>

在Tree.vue入口組件里引入子組件TreeMenu.vue,并且向子組件傳遞數(shù)據(jù)label和nodes,這里data先預(yù)定義一個(gè)簡(jiǎn)單的對(duì)象,后面會(huì)動(dòng)態(tài)獲取。

TreeMenu.vue作為樹(shù)形菜單組件,負(fù)責(zé)遞歸和數(shù)據(jù)渲染,它會(huì)接受來(lái)自入口組件傳遞來(lái)的label和nodes數(shù)據(jù),進(jìn)行渲染, 并且繼續(xù)遞歸傳遞nodes和label 。

在從父組件接收nodes和label后,先循環(huán)渲染n個(gè)tree-menu組件,然后每一個(gè)tree-menu又會(huì)遞歸自身,所以數(shù)據(jù)就這樣一層層向下傳遞nodes=>nodes.node=>nodes.node.node,此時(shí)已經(jīng)完成了數(shù)據(jù)與Dom的綁定,可以修改一下Tree.vue中的tree數(shù)據(jù)源,看一下組件是否動(dòng)態(tài)改變了。現(xiàn)在渲染如下圖:


數(shù)據(jù)正確渲染,現(xiàn)在需要加一些樣式和點(diǎn)擊事件(展開(kāi)與收縮),就不做詳細(xì)介紹了,代碼如下: (向下傳遞depth參數(shù)來(lái)獲取層級(jí)索引)

//Tree.vue
<template>
 <div class="tree-alone">
 <tree-menu :label="tree.label" :nodes="tree.nodes" :depth="0"></tree-menu>
 </div>
</template>

//TreeMenu.vue
<template>
 <div class="tree-menu">
 <div :style="indent" @click="toggleChildren">{{label}}</div>
 <div v-if="showChildren">
  <tree-menu
  v-for="(item, index) of nodes"
  :key="index"
  :nodes="node.nodes"
  :label="node.label"
  :depth="depth + 1"
  ></tree-menu>
 </div>
 </div>
</template>

<script>
export default {
 name: "TreeMenu",
 props: ["label", "nodes"],
 data() {
 return {
  showChildren: false
 };
 },
 methods: {
 toggleChildren() {
  this.showChildren = !this.showChildren;
 }
 },
 computed: {
 indent() {
  return { transform: `translate(${this.depth * 20}px)` };
 }
 }
};
</script>

修改后會(huì)展開(kāi)收縮與縮進(jìn),一些箭頭旋轉(zhuǎn)等樣式問(wèn)題就不詳細(xì)寫(xiě)了。


總結(jié)

以上所述是小編給大家介紹的Vue遞歸組件+Vuex開(kāi)發(fā)樹(shù)形組件Tree--遞歸組件的簡(jiǎn)單實(shí)現(xiàn),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • springboot + vue+elementUI實(shí)現(xiàn)圖片上傳功能

    springboot + vue+elementUI實(shí)現(xiàn)圖片上傳功能

    文章描述了如何使用Element UI的el-upload組件實(shí)現(xiàn)前端圖片上傳,并將圖片存儲(chǔ)到后端數(shù)據(jù)庫(kù),同時(shí)在頁(yè)面上回顯上傳的圖片,后端通過(guò)接口接收?qǐng)D片,并將其存儲(chǔ)在指定位置,然后返回圖片路徑以便在前端顯示,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-01-01
  • vue實(shí)現(xiàn)動(dòng)態(tài)列表尾部添加數(shù)據(jù)執(zhí)行動(dòng)畫(huà)

    vue實(shí)現(xiàn)動(dòng)態(tài)列表尾部添加數(shù)據(jù)執(zhí)行動(dòng)畫(huà)

    這篇文章主要介紹了vue實(shí)現(xiàn)動(dòng)態(tài)列表尾部添加數(shù)據(jù)執(zhí)行動(dòng)畫(huà)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue 2.5 Level E 發(fā)布了: 新功能特性一覽

    Vue 2.5 Level E 發(fā)布了: 新功能特性一覽

    很高興Vue 2.5 Level E 發(fā)布了。在這篇文章中,我們將重點(diǎn)介紹一些更重要的的變化:更好的 TypeScript 集成,更好的錯(cuò)誤處理,更好地支持單文件組件中的函數(shù)式組件以及與環(huán)境無(wú)關(guān)的服務(wù)端渲染
    2017-10-10
  • vue-router 4使用實(shí)例詳解

    vue-router 4使用實(shí)例詳解

    雖然 vue-router 4 大多數(shù) API 保持不變,但是在 vue3 中以插件形式存在,所以在使用時(shí)有一定的變化。接下來(lái)就學(xué)習(xí)學(xué)習(xí)它是如何使用的
    2021-11-11
  • vue2基本響應(yīng)式實(shí)現(xiàn)方式之讓數(shù)組也變成響應(yīng)式

    vue2基本響應(yīng)式實(shí)現(xiàn)方式之讓數(shù)組也變成響應(yīng)式

    這篇文章主要介紹了vue2基本響應(yīng)式實(shí)現(xiàn)方式之讓數(shù)組也變成響應(yīng)式問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue之“} expected“和“at-rule or selector expected“報(bào)錯(cuò)的解決

    vue之“} expected“和“at-rule or selector ex

    這篇文章主要介紹了vue之“} expected“和“at-rule or selector expected“報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue中子組件調(diào)用父組件的3種方法實(shí)例

    Vue中子組件調(diào)用父組件的3種方法實(shí)例

    vue子組件調(diào)用父組件的方法其實(shí)不難,最近整理了一下,下面這篇文章主要給大家介紹了關(guān)于Vue中子組件調(diào)用父組件的3種方法,需要的朋友可以參考下
    2022-05-05
  • Vue2.0腳手架搭建

    Vue2.0腳手架搭建

    這篇文章介紹了使用vue-cli搭建腳手架的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • vue 中url 鏈接左邊的小圖標(biāo)更改問(wèn)題

    vue 中url 鏈接左邊的小圖標(biāo)更改問(wèn)題

    這篇文章主要介紹了vue 中url 鏈接左邊的小圖標(biāo)更改問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • vue實(shí)現(xiàn)兩個(gè)區(qū)域滾動(dòng)條同步滾動(dòng)

    vue實(shí)現(xiàn)兩個(gè)區(qū)域滾動(dòng)條同步滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)兩個(gè)區(qū)域滾動(dòng)條同步滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評(píng)論

郧西县| 潜江市| 商水县| 辉县市| 鹤峰县| 茌平县| 石台县| 茶陵县| 威远县| 仙桃市| 蚌埠市| 和平区| 玉溪市| 上犹县| 白河县| 静海县| 麻江县| 噶尔县| 桓仁| 手机| 武乡县| 万州区| 揭东县| 双桥区| 孟村| 许昌县| 和龙市| 拉萨市| 甘南县| 德钦县| 高碑店市| 泗洪县| 南岸区| 盱眙县| 鲁甸县| 南雄市| 平凉市| 通榆县| 利津县| 陆川县| 白城市|