首頁 > web前端 > Vue.js > 帶你簡單了解AntDesign Vue中Menu選單的用法

帶你簡單了解AntDesign Vue中Menu選單的用法

青灯夜游
發布: 2021-12-20 11:33:13
轉載
5640 人瀏覽過

這篇文章給大家了解一下Ant Design Vue中Menu菜單的使用方法,介紹一下其中的常用屬性、常用事件,以及如何遞歸嵌套多級菜單,希望對大家有所幫助!

帶你簡單了解AntDesign Vue中Menu選單的用法

版本ant-design-vue: "^1.7.4",

常用屬性

屬性 說明 #預設值
mode 選單類型,現在支援垂直、水平、和內嵌模式三種 #vertical
inlineCollapsed inline 時選單是否收起狀態
theme 主題顏色(light/dark) light
openKeys(.sync) 目前展開的SubMenu 選單項目key 陣列
defaultOpenKeys 初始展開的SubMenu 選單項目key 陣列
#selectedKeys(v-model) 目前選取的選單項目key 陣列
#defaultSelectedKeys 初始選取的選單項目key 陣列

說明
defaultSelectedKeys是預設選取的keya-menu-item上綁定的key),被選取會有高亮的顯示效果;selectedKeys 也是一樣的作用,不要同時使用,差別在於如果只希望指定一個初始化的選單選項就使用defaultSelectedKeys,如果需要透過自己修改資料來選取選單的選取項目就使用 selectedKeys

openKeysdefaultOpenKeys也是同理)

常用事件

openChangeMenu的事件,SubMenu 展開/關閉的回呼

#遞歸嵌套多級選單

若只有兩層選單則直接使用v -forv-if指令即可完成;若選單級數≥3則需要使用函數式元件。具體原因官網已經做了說明:

Before v2.0, 因元件內部會動態變更a-sub-menu的屬性,如果分割成單一文件,無法將屬性掛載到a-sub-menu上,你需要自行宣告屬性並掛載。為了方便,避免屬性的聲明,我們建議使用函數式元件。

程式碼
App.vue (測試就隨便在App.vue裡面寫了)

<template>
    <div id="app">
        <div style="width: 256px">
            <a-button type="primary" style="margin-bottom: 16px" @click="toggleCollapsed">
            <a-icon :type="collapsed ? &#39;menu-unfold&#39; : &#39;menu-fold&#39;" />
            </a-button>
            <a-menu
                :defaultSelectedKeys="[$route.path]"
                :openKeys="openKeys"
                mode="inline"
                theme="dark"
                :inline-collapsed="collapsed"
                @openChange="onOpenChange"
                @click="menuClick"
            >
                <template v-for="item in list">
                    <a-menu-item v-if="!item.children" :key="item.path">
                        <a-icon type="pie-chart" />
                        <span>{{ item.title }}</span>
                    </a-menu-item>
                    <sub-menu v-else :key="item.path" :menu-info="item" />
                </template>
            </a-menu>
        </div>
        <router-view/>
    </div>
</template>

<script>
import { Menu } from &#39;ant-design-vue&#39;;
const SubMenu = {
  template: `
      <a-sub-menu :key="menuInfo.key" v-bind="$props" v-on="$listeners">
        <span slot="title">
          <a-icon type="mail" /><span>{{ menuInfo.title }}</span>
        </span>
        <template v-for="item in menuInfo.children">
          <a-menu-item v-if="!item.children" :key="item.path">
            <a-icon type="pie-chart" />
            <span>{{ item.title }}</span>
          </a-menu-item>
          <sub-menu v-else :key="item.path" :menu-info="item" />
        </template>
      </a-sub-menu>
    `,
  name: &#39;SubMenu&#39;,
  // must add isSubMenu: true 此项必须被定义
  isSubMenu: true,
  props: {
    // 解构a-sub-menu的属性,也就是文章开头提到的为什么使用函数式组件
    ...Menu.SubMenu.props,
    // Cannot overlap with properties within Menu.SubMenu.props
    menuInfo: {
      type: Object,
      default: () => ({}),
    },
  },
};

export default {
    name: "App",
    components: {
        &#39;sub-menu&#39;: SubMenu,
    },
    data() {
        return {
            collapsed: false,
            openKeys: [],
            rootSubmenuKeys: [&#39;/user&#39;],
            list: [
                {
                    key: &#39;1&#39;,
                    title: &#39;信息管理&#39;,
                    path: &#39;/info&#39;,
                },
                {
                    key: &#39;2&#39;,
                    title: &#39;用户管理&#39;,
                    path: &#39;/user&#39;,
                    children: [
                        { 
                            key: &#39;2.1&#39;,
                            title: &#39;后台用户&#39;,
                            path: &#39;/adminUser&#39;,
                            children: [
                                { 
                                    key: &#39;2.1.1&#39;,
                                    title: &#39;新增用户&#39;,
                                    path: &#39;/addAdminUser&#39;,
                                    children: [
                                        {
                                            key: &#39;2.1.1。1&#39;,
                                            title: &#39;用户xx&#39;,
                                            path: &#39;/addAdminUserXX&#39;,
                                        }
                                    ]
                                }
                            ]
                        },
                        { 
                            key: &#39;2.2&#39;,
                            title: &#39;前台用户&#39;,
                            path: &#39;/frontUser&#39;,
                        }
                    ]
                }
            ],
        };
    },
    created(){
        const openKeys = window.sessionStorage.getItem(&#39;openKeys&#39;)
        if(openKeys){
            this.openKeys = JSON.parse(openKeys)
        }
    },
    methods: {
        toggleCollapsed() {
            this.collapsed = !this.collapsed;
        },
        onOpenChange(openKeys) {
            // 将当前打开的父级菜单存入缓存中
            window.sessionStorage.setItem(&#39;openKeys&#39;, 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] : [];
            }
        },
        menuClick({key}) {
            // 获取到当前的key,并且跳转
            this.$router.push({
                path: key
            })
        },
    }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  padding: 50px;
}
</style>
登入後複製

這裡省略了router配置,相信在座的各位也會! (不會的底下留言,包教包會!)

如果vue報編譯錯誤You are using the runtime-only build of Vue,可以在vue的設定檔裡加一行runtimeCompiler: true,重新運行即可。

如果點選同一個選單報錯了NavigationDuplicated: Avoided redundant navigation to current location,需要修改下Router設定(router/index. js):

const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
    return originalPush.call(this, location).catch(err => err)
}
登入後複製

效果

帶你簡單了解AntDesign Vue中Menu選單的用法

#自動渲染多層次巢狀選單;重新整理會儲存選取的選單;點選選單,收起其他展開的所有選單。

【相關推薦:《vue.js教學》】

以上是帶你簡單了解AntDesign Vue中Menu選單的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板