vue+quasar使用遞歸實現動態多級菜單
本文實例為大傢分享瞭vue+quasar使用遞歸實現動態多級菜單的具體代碼,供大傢參考,具體內容如下
效果圖:
菜單初始化入口 menu.vue,初始化側邊欄菜單組建,<my-q-menu/>才是遞歸開始
<template> <q-drawer v-model="is_hide_" show-if-above bordered content-class="bg-grey-2" :width="240" > <q-scroll-area class="fit"> <!-- 遞歸實現 循環菜單 --> <my-q-menu/> </q-scroll-area> </q-drawer> </template> <script> import MyQMenu from './myQMenu' export default { name: 'myMenu', components: { MyQMenu }, data () { return { leftDrawerOpen: true } }, props: ['is_hide'], computed: { is_hide_: { get () { return this.is_hide }, // boolean 型,用於控制側邊菜單欄是否顯示 set () {} } }, } </script>
菜單遞歸入口 <my-q-menu/>,傳入menuList.json菜單配置信息
參數說明
@my-router 菜單配置信息
@init-level 初始化菜單縮進大小
<template> <div> <!-- 動態菜單 --> <q-list> <my-q-menu-item :my-router="menuList" :init-level="0"/> </q-list> </div> </template> <script> import MyQMenuItem from './myQMenuItem' export default { name: 'my-q-menu', components: { MyQMenuItem }, data () { return { menuList: [ { icon: 'inbox', label: '菜單1', children: [ { icon: 'perm_identity', label: '菜單1-1', path: '/about' }, { icon: 'delete', label: '菜單1-2', children: [ { icon: 'settings', label: '菜單2-1', path: '/noty' } ] } ] }, { isItemLabel: true, Label_text: 'item-label ' }, { icon: 'feedback', label: '菜單數據結構', path: '/test', hidden: false } ] } } } </script>
菜單元素遞歸執行體 <my-q-menu-item/>
<!-- 動態菜單 item 遞歸實現 myRouter : 菜單列表 initLevel : 菜單初始化縮進等級 author : ths --> <template> <div> <div v-for="(item,index) in myRouter" :key="index"> <!-- 當菜單item標識為 ItemLabel 時,顯示Label_text,不渲染為菜單 --> <q-item-label v-if="item.isItemLabel" header class="text-weight-bold text-uppercase"> {{item.Label_text}} </q-item-label> <!-- 先判斷當前菜單是否需要顯示 --> <div v-if="!item.hidden && !item.isItemLabel"> <!-- 當沒有子菜單時,結束遞歸 --> <div v-if="!item.children"> <q-expansion-item :header-inset-level="initLevel" expand-icon="1" :to="item.path" :icon="item.icon" :label="item.label" /> </div> <!-- 子菜單依然存在時,繼續遞歸 --> <div v-else> <q-expansion-item expand-separator :header-inset-level="initLevel" :to="item.path" :icon="item.icon" :label="item.label" > <!-- 進入下一次遞歸 --> <my-q-menu-item :my-router="item.children" :init-level="initLevel+0.3"/> </q-expansion-item> </div> </div> </div> </div> </template> <script> export default { name: 'my-q-menu-item', data () { return {} }, props: ['myRouter', 'initLevel'] } </script>
菜單元素解釋
menuList: [ { icon: 'inbox', //圖標 label: '菜單1', //label children: [ { icon: 'perm_identity', label: '菜單1-1', path: '/about' //路徑 }, { icon: 'delete', label: '菜單1-2', children: [ { icon: 'settings', label: '菜單2-1', path: '/noty' } ] } ] }, { isItemLabel: true, //是否分隔欄 Label_text: 'item-label ' //分隔欄label }, { icon: 'feedback', label: '菜單數據結構', path: '/test', hidden: false //是否隱藏 } ]
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。