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

Vue遞歸實現(xiàn)樹形菜單方法實例

 更新時間:2018年11月06日 14:10:58   作者:黃鑫  
學習vue有一段時間了,最近使用vue做了一套后臺管理系統(tǒng),其中使用最多就是遞歸組件,下面這篇文章主要給大家介紹了關(guān)于Vue利用遞歸實現(xiàn)樹形菜單的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

什么是樹形菜單還是要簡單的啰嗦一下,比如:


上圖是截圖自elementui的實例,實現(xiàn)方式是用文檔結(jié)構(gòu)(類似像原生Dom文檔結(jié)構(gòu)的寫法)的方式,好處就是很靈活,可以方便的自定義,作為一個通用視圖組件庫這是正確的做法。

在實際的企業(yè)應用中,菜單要比這復雜很多,層次也要多很多,如果我們采取手動編寫文檔結(jié)構(gòu)的方式,會導致代碼亢長,閱讀和維護都很低效。毫無疑問所有Vuer都會想到用一個數(shù)據(jù)結(jié)構(gòu)來驅(qū)動文檔結(jié)構(gòu)。vue-router的數(shù)據(jù)結(jié)構(gòu)恰恰就是完美的嵌套層次結(jié)構(gòu)(樹結(jié)構(gòu)),同時vue文檔中也提到了遞歸組件,基于這兩點,我們來擼碼,不過這次有所不同,我們選擇使用render函數(shù)來實現(xiàn),而不是在模板中遞歸。

數(shù)據(jù)結(jié)構(gòu):vue-router的數(shù)據(jù)結(jié)構(gòu)

const routes = [
 {
 name: 'home',
 path: '/home',
 meta: { text: '首頁' }
 },
 {
 name: 'inner',
 path: '/inner',
 meta: { text: '內(nèi)部平臺' },
 children: [
  {
  name: 'oa',
  path: 'oa',
  meta: { text: 'OA' }
  },
  {
  name: 'jira',
  path: 'jira',
  meta: { text: 'Jira' }
  },
  {
  name: 'wiki',
  path: 'wiki',
  meta: { text: 'Wiki' }
  },
  {
  name: 'caiwu',
  path: 'caiwu',
  meta: { text: '財務' },
  children: [
   {
   name: 'chailv',
   path: 'chailv',
   meta: { text: '差旅' }
   },
   {
   name: 'richang',
   path: 'richang',
   meta: { text: '日常' },
   children: [
    {
    name: 'taxi',
    path: 'taxi',
    meta: { text: '交通' }
    },
    {
    name: 'tel',
    path: 'tel',
    meta: { text: '通信' }
    }
   ]
   }
  ]
  }
 ]
 },
 {
 name: 'sec',
 path: '/sec',
 meta: { text: '審核' },
 children: [
  {
  name: 'acl',
  path: '/acl',
  meta: { text: 'ACL' }
  }
 ]
 }
]

組件實現(xiàn):

先看看render函數(shù),其中包含一個遞歸函數(shù)elements:

render (r) {
 return r(
  'el-menu',
  {
  props: {
   backgroundColor: "#545c64",
   textColor: "#fff",
   activeTextColor: "#ffd04b"
  },
  on: {
   select: this.onSelect
  }
  },
  this.elements(this.routes, r)
 )
 }

elements函數(shù):

elements (routes, r) {
  return routes
  .map(route => {
   if (!route.paths) route.paths = []
   if (route.children && route.children.length) {
   return r(
    'el-submenu',
    {
    props: {
     index: route.name
    }
    },
    [
    r(
     'span',
     {
     slot: 'title'
     },
     [
     route.meta.text
     ]
    ),
    this.elements(route.children, r)
    ]
   )
   } else if (route.path) {
   return r(
    'el-menu-item',
    {
    props: {
     index: route.name
    }
    },
    [
    route.meta.text
    ]
   )
   } else {
   return null
   }
  })
  .filter(item => item)
 }

最終效果:


完整代碼示例請戳:https://codepen.io/360vislab/pen/GQqBve

總結(jié):

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • vue3中的reactive函數(shù)聲明數(shù)組方式

    vue3中的reactive函數(shù)聲明數(shù)組方式

    這篇文章主要介紹了vue3中的reactive函數(shù)聲明數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 深入探討Vue?3中的組合式函數(shù)編程方式

    深入探討Vue?3中的組合式函數(shù)編程方式

    Vue?3中引入了組合式函數(shù)編程方式,可以更好地實現(xiàn)代碼的復用和可維護性。通過定義可組合的函數(shù),可以將組件的邏輯和狀態(tài)進行拆分和組合,實現(xiàn)更靈活的代碼組織方式。同時,組合式函數(shù)也支持響應式數(shù)據(jù)和生命周期鉤子函數(shù),更加貼近Vue開發(fā)的實際場景
    2023-05-05
  • Vue?項目的成功發(fā)布和部署的實現(xiàn)

    Vue?項目的成功發(fā)布和部署的實現(xiàn)

    本文主要介紹了Vue?項目的成功發(fā)布和部署的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Vue3?<script?setup?lang=“ts“>?的基本使用

    Vue3?<script?setup?lang=“ts“>?的基本使用

    <script setup>?是在單文件組件 (SFC) 中使用?composition api?的編譯時語法糖,本文主要講解<script setup>?與?TypeScript?的基本使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • 淺談一下Vue生命周期中mounted和created的區(qū)別

    淺談一下Vue生命周期中mounted和created的區(qū)別

    每一個vue實例從創(chuàng)建到銷毀的過程,就是這個vue實例的生命周期,在這個過程中,他經(jīng)歷了從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom、渲染→更新→渲染、卸載等一系列過程,那么這些過程中,具體vue做了些啥,我們今天來了解一下
    2023-05-05
  • vue中使用vue-pdf組件實現(xiàn)文件預覽及相應報錯解決

    vue中使用vue-pdf組件實現(xiàn)文件預覽及相應報錯解決

    在需求中,經(jīng)常遇見pdf的在線預覽效果,很多pdf插件不支持vue3,或者是沒有集成翻頁放大縮小功能,比如vue-pdf,下面這篇文章主要給大家介紹了關(guān)于vue中使用vue-pdf組件實現(xiàn)文件預覽及相應報錯解決的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 關(guān)于Vue單頁面骨架屏實踐記錄

    關(guān)于Vue單頁面骨架屏實踐記錄

    這篇文章主要給大家介紹了關(guān)于Vue單頁面骨架屏實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-12-12
  • Vue3單擊新增添加新的input的方法

    Vue3單擊新增添加新的input的方法

    這篇文章主要介紹了Vue3單擊新增添加新的input,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,文中補充介紹了Vue動態(tài)綁定、添加input,需要的朋友可以參考下
    2023-01-01
  • 一文徹底教會你在vue中寫jsx

    一文徹底教會你在vue中寫jsx

    以前我們經(jīng)常在react中使用jsx,現(xiàn)在我們在vue中也是用jsx,下面這篇文章主要給大家介紹了關(guān)于在vue中寫jsx的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 在vue項目中如何獲取視頻的時長

    在vue項目中如何獲取視頻的時長

    這篇文章主要介紹了在vue項目中如何獲取視頻的時長,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論

瑞金市| 延寿县| 兴仁县| 高平市| 溧阳市| 商水县| 望城县| 金湖县| 游戏| 吉木萨尔县| 东阳市| 托克逊县| 杭州市| 贡觉县| 溧阳市| 仲巴县| 张家港市| 瓮安县| 界首市| 榕江县| 渝北区| 泗阳县| 托里县| 凤城市| 衡阳市| 大连市| 麦盖提县| 连南| 衡阳县| 海南省| 象州县| 江安县| 湟中县| 九江市| 池州市| 洛宁县| 新化县| 兴化市| 广河县| 应城市| 舒城县|