ant-design-vue導(dǎo)航菜單a-menu的使用解讀
此文章包含了遞歸生成三級菜單,刷新狀態(tài)保留,只展開一個父級菜單等常見問題。
一、效果
可以看到遞歸生成三級菜單,刷新狀態(tài)保留,只展開一個父級菜單等常見問題得以解決。我自己的電腦設(shè)備老舊,反應(yīng)緩慢的問題請忽略。
二、關(guān)鍵的API
說實話遇到問題了不知道該怎么解決,說白了還是不懂得API的使用,對相關(guān)的API不夠了解,熟悉了API怎么操作都行。下面說說用到但是又容易混淆的API。
1.defaultSelectedKeys 默認(rèn)選中的key
這里的key對應(yīng)的是a-menu-item上面綁定的key,如果被選中,會進(jìn)行導(dǎo)航的跳轉(zhuǎn)以及被給予高亮狀態(tài)。
2.openKeys 展開的a-sub-menu的key
這里的key對應(yīng)的是a-sub-menu上面綁定的key。如果綁定在a-menu上,對應(yīng)的子菜單會打開。
3.selectedKeys 受控選中的key
這里的key對應(yīng)的是a-menu-item上面綁定的key,如果被選中,會進(jìn)行導(dǎo)航的跳轉(zhuǎn)以及被給予高亮狀態(tài)。
與defaultSelectedKeys 有什么區(qū)別:
- 這兩個屬性為二選一使用,如果同時使用時,defaultSelectedKeys無效,將會以selectedKeys為準(zhǔn)。
- 如果你只是希望指定一個初始化選中的菜單項,請使用defaultSelectedKeys;
- 如果你需要每次通過傳入不同的props改變Menu組件的選中項,請使用selectedKeys。
三、注意事項
此處強(qiáng)調(diào)一點,如果是一級以及二級菜單的生成,普通的兩層for循環(huán)結(jié)合遞歸以及v-if生成即可。
如果是想使用a-menu生成三級或者三級以上的菜單,那么就需要定義在單文件內(nèi)定義函數(shù)式組件。那為什么不推薦單文件的形式定義組件,而是使用函數(shù)式組件?
以下是官方文檔的說明:
四、代碼
<template> <a-layout id="components-layout-demo-custom-trigger" style="height:100%"> <a-layout-sider theme="light" v-model="collapsed" :trigger="null" collapsible> <div > <a-menu :inlineIndent="inlineIndent" :defaultSelectedKeys="[$route.path]" :openKeys="openKeys" mode="inline" :inline-collapsed="collapsed" @openChange="onOpenChange" @click="menuClick"> <!-- 菜單遍歷的開始 --> <template v-for="item in list"> <!-- 如果當(dāng)前遍歷項沒有children,視為子菜單項,注意所有的key都是path用于路由跳轉(zhuǎn),以及當(dāng)前選中記錄 --> <a-menu-item v-if="!item.children" :key="item.path"> <i :class="item.icon" /> <span>{{ item.title }}</span> </a-menu-item> <!-- 否則視為子菜單,傳入菜單信息并且運用下面定義的函數(shù)式組件 --> <sub-menu v-else :key="item.path" :menu-info="item" /> </template> </a-menu> </div> </a-layout-sider> <a-layout> <a-layout-content :style="{ margin: '24px 16px', padding: '24px', background: '#fff', minHeight: '280px' }"> <router-view/> </a-layout-content> </a-layout> </a-layout> </template> <script> import { Menu } from 'ant-design-vue'; // 定義函數(shù)式組件 const SubMenu = { template: ` <a-sub-menu :key="menuInfo.path" v-bind="$props" v-on="$listeners"> <span slot="title"> <i :class="menuInfo.icon" /><span>{{ menuInfo.title }}</span> </span> <template v-for="item in menuInfo.children"> <a-menu-item v-if="!item.children" :key="item.path"> <i :class="item.icon" /> <span>{{ item.title }}</span> </a-menu-item> <sub-menu v-else :key="item.path" :menu-info="item" /> </template> </a-sub-menu> `, name: 'SubMenu', // must add isSubMenu: true 此項必須被定義 isSubMenu: true, props: { // 解構(gòu)a-sub-menu的屬性,也就是文章開頭提到的為什么使用函數(shù)式組件 ...Menu.SubMenu.props, // 接收父級傳遞過來的菜單信息 menuInfo: { type: Object, default: () => ({}), }, }, }; export default { data() { return { // 菜單縮進(jìn) inlineIndent:12, // 默認(rèn)不折疊 collapsed: false, // 全部頂級父節(jié)點,用來控制所有父級菜單只展開其中的一項,可用遍歷菜單信息進(jìn)行賦值 rootSubmenuKeys: ['/infomationManage','/safeInfoManage','/qualityInfoManage'], // 展開的父菜單項 openKeys: [], // 選中的子菜單項 defaultSelectedKeys: [this.$route.path], // 菜單信息,可從后臺獲取 list: [ { key: '1', title: '項目信息管理', path: '/infomationManage', icon:'iconfont icon-information' }, { key: '2', title: '安全信息管理', path: '/safeInfoManage', icon:'iconfont icon-anquan', children: [ { key: '2.1', title: '安全風(fēng)險管理', path: '/safeRisk', icon:'', children: [ { key: '2.1.1', title: '風(fēng)險分類管理', path: '/riskClassifyManage', icon:'', }, { key: '2.1.2', title: '分類辨識', path: '/classifyIdentity', icon:'', } ], }, ], }, { key: '3', title: '質(zhì)量信息管理', path: '/qualityInfoManage', icon:'iconfont icon-zhiliang', children:[ { key: '3.1', title: '質(zhì)量控制點管理', path: '/controlPointManage', icon:'', } ] } ], } }, created(){ // 將從緩存中取出openKeys const openKeys = window.sessionStorage.getItem('openKeys') if(openKeys){ // 存在即賦值 this.openKeys = JSON.parse(openKeys) } }, methods: { // 點擊菜單,路由跳轉(zhuǎn),注意的是當(dāng)點擊MenuItem才會觸發(fā)此函數(shù) menuClick({ item, key, keyPath }) { // 獲取到當(dāng)前的key,并且跳轉(zhuǎn) this.$router.push({ path: key }) }, onOpenChange(openKeys) { // 將當(dāng)前打開的父級菜單存入緩存中 window.sessionStorage.setItem('openKeys', JSON.stringify(openKeys)) // 控制只打開一個 const latestOpenKey = openKeys.find(key => this.openKeys.indexOf(key) === -1); if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) { this.openKeys = openKeys; } else { this.openKeys = latestOpenKey ? [latestOpenKey] : []; } }, }, // 注冊局部組件 components: { 'sub-menu': SubMenu, }, }; </script> <style> </style>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
VUE?el-table列表搜索功能純前端實現(xiàn)方法
Vue表搜索是指在Vue應(yīng)用中實現(xiàn)對表格數(shù)據(jù)的搜索功能,下面這篇文章主要給大家介紹了關(guān)于VUE?el-table列表搜索功能純前端實現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09vue element ui使用選擇器實現(xiàn)地區(qū)選擇兩種方法
這篇文章主要給大家介紹了關(guān)于vue element ui使用選擇器實現(xiàn)地區(qū)選擇的兩種方法,Element UI是一套基于Vue.js開發(fā)的UI組件庫,其中包含了地區(qū)選擇器(Cascader)組件,需要的朋友可以參考下2023-09-09Vue3中watchEffect和watch的基礎(chǔ)應(yīng)用詳解
watch是一個偵聽器,默認(rèn)是懶偵聽的,即僅在偵聽源發(fā)生變化時才執(zhí)行回調(diào)函數(shù),watchEffect是會自動收集函數(shù)里面變量的響應(yīng)式依賴,本文主要來講講二者的區(qū)別,感興趣的可以了解一下2023-07-07Vue循環(huán)組件加validate多表單驗證的實例
今天小編就為大家分享一篇Vue循環(huán)組件加validate多表單驗證的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09