1. 程式人生 > >vue實現動態載入可收縮選單欄

vue實現動態載入可收縮選單欄

引言

作為web前端開發,幾乎所有的web系統介面都會使用到選單欄,而大多數的左側選單欄都是可收縮的。接下來就一起學習下如何根據從後端獲取到的資料,動態的載入選單欄。

GitHub連結

Element-UI

我們可以使用element官網的官方demo作為基礎,因為官網上的demo並不是動態獲取的資料,而是寫死的選單項,且不能做到可收縮。下面將具體介紹如何實現動態載入選單項以及可收縮選單的實現。

資料格式

資料格式不唯一,內部屬性有些是可以不需要的,但是id,parentId,name,actionUrl在這裡是必需的。當然主要還是看個人的需求。

// An highlighted block
var
_list = [ { id: '6', name: '個人演算法', parentId: '0', hasChildren: true, parentName: null, url: '', actionUrl: '', visible: '1', check: false, children: [ { id:
'1', name: '使用者管理', parentId: '6', hasChildren: false, parentName: "個人演算法", text: "使用者管理", url: "/alm/user/list", actionUrl: '/user/list', children:
[] }, { id: '2', name: '策略設定', parentId: '6', hasChildren: false, parentName: "個人演算法", text: "策略設定", url: "/alm/strategy/list", actionUrl: '/strategy/list', children: [] } ] }, { id: '8', name: '個人方案', parentId: '0', hasChildren: true, parentName: null, url: '', actionUrl: '', visible: '1', check: false, children: [ { id: '3', name: '方案管理', parentId: '8', hasChildren: false, parentName: "個人方案", text: "方案管理", url: "/alm/programme/list", actionUrl: '/programme/list', children: [] }, { id: '4', name: '資料統計', parentId: '8', hasChildren: false, parentName: "個人方案", text: "資料統計", url: "/alm/datas/list", actionUrl: '/datas/list', children: [] } ] } ]

傳參到選單欄元件中

用上述的_list賦值給menus,傳參到選單欄元件中。資料同樣可以從後臺獲取到,直接賦值給你要傳的引數即可。選單欄元件內接受到後,即可使用該資料。

	<!--側邊欄-->
    <left-menu :top-title="title" :menus="menus" ></left-menu>

el-menu的主要寫法

在實現過程中,該demo只測試過一級到二級的選單,尚未測試過三級以上的。如果有以上的需求,只要理清實現的原理,相信也是可以擼出來的。 如果對el-menu中的el-submenu以及el-menu-item有不太理解的地方,可以先去看看官網的基礎demo。 連結:element官網menu

<el-menu
                class="el-menu-vertical-demo"
                :unique-opened="true"
                :router="true"
                @open="handleOpen"
                @close="handleClose"
                background-color="#324157"
                text-color="#fff"
                active-text-color="#2bb8ed"
                :default-active="defaultActive"
                :collapse="this.$store.state.isCollapse">
            <el-menu-item index="8">
                <i class="el-icon-phone-outline"></i>
                <span>{{topTitle}}</span>
            </el-menu-item>
            <template v-for="item in menus" :index="item.id">
                <template v-if="item.hasChildren" >
                    <el-submenu  :index="item.id">
                        <template slot="title" >
                            <i class="el-icon-menu"></i>
                            <span class="title-instance-left">{{item.name}}</span>
                        </template>
                        <el-menu-item v-for="subItem in item.children" :key="subItem.id" :index="subItem.actionUrl" @click="openUrl(subItem.actionUrl)">
                            <span class="title-instance-left">{{ subItem.name }}</span>
                        </el-menu-item>
                    </el-submenu>
                </template>
                <template v-else>
                    <el-menu-item :index="item.actionUrl" @click="openUrl(item.actionUrl)">
                        <label>{{ item.name }}</label>
                    </el-menu-item>
                </template>
            </template>
        </el-menu>

如何實現可收縮

通常我們是通過點選按鈕來觸發事件,達到收縮選單欄的效果。這裡的問題主要集中於,左側選單欄的展開與收縮,以及右側實際內容區域的跟隨變化。即,當左側收縮時,右側內容區域會向左跟進;左側展開時,右側內容區域會向右搜尋。

而demo中針對這一問題,主要是運用transition這個屬性來實現的。所以,就需要使用到變數來動態的切換class類,達到不同的樣式效果。

引用右側內容元件中的動態class

根據變數isLeftOpen來進行控制右側內容區域的收縮的。

	<!--右側路由部分-->
    <div :class="['inner-layout__right-part', {'inner-layout__right-part_open': !isLeftOpen},{'inner-layout__right-part_close': isLeftOpen}]">
         <router-view ></router-view>
    </div>
el-menu的收縮

el-menu的收縮主要是根據el-menu中的collapse屬性來控制的

//動態繫結collapse,isCollapse是寫在全域性中的
:collapse="this.$store.state.isCollapse"
通過點選按鈕實現更改變數值,達到可收縮效果

點選收縮按鈕,觸發事件,更改對應的變數,實現可收縮效果。

	transformMenu(){
         if(this.$store.state.isCollapse === true){
            	this.$store.commit('SET_IS_COLLAPSE', false);
                this.isLeftOpen = true;
         }else{
                this.$store.commit('SET_IS_COLLAPSE', true);
                this.isLeftOpen = false;
         }
     },

對於this.$store.commit的寫法有不理解的地方,建議可以去看下vuex

結束語

以上內容主要就是本次對動態載入可收縮選單欄的講解,如有不明之處可評論,github中會持續更新在專案中遇到的一些問題,謝謝!