最近在做動態(tài)的菜單欄,但是發(fā)現(xiàn)VUE在生成實例的時候已經(jīng)把router加載了,但是我想在用戶登錄之后,從后臺的數(shù)據(jù)庫里面查詢到其擁有的菜單權(quán)限,然后返回到前端去動態(tài)加載路由,隨后發(fā)現(xiàn)網(wǎng)上說vue-router2.2之后的addRoutes()是可以實現(xiàn)這個功能的,隨機試了一下,但是出現(xiàn)了寫問題,希望大神提點
我想現(xiàn)在前端測試下addRoutes()可以實現(xiàn)否,就打算手動給他傳一個路由格式的內(nèi)容,看看能不能行
我在main.js里面調(diào)用addRoutes()方法
const router = new VueRouter({ //全局變量router:routes
mode:'history',
routes
})
var a = [];
a.push(
{
path: '/',
component: require('@/views/Home.vue'),
name: '系統(tǒng)設(shè)置',
iconCls: 'fa fa-cogs',
children: [
{ path: '/roleSetting', pri:['R_ADMIN','R_TRA','R_LAN','R_WAT','R_ENT'],component: require('@/views/systemSetting/roleSetting.vue'), name: '角色管理' }
]
},
{
path: '/404',
component: require('@/views/404.vue'),
name: '',
hidden: true
},
{
path: '*',
hidden: true,
redirect: { path: '/404' }
}
);
router.addRoutes(a);
router.beforeEach((to, from, next) => {
//console.log('main.js '+to.path);
if(!Vue.prototype.$userInfo || !Vue.prototype.$token){
var c = getCookie('userInfo');
var ct = getCookie('token');
if(c&&c!="") Vue.prototype.$userInfo = JSON.parse(c);
if(ct&&ct!="") Vue.prototype.$token = ct;
console.log('before route');
console.log(Vue.prototype.$userInfo);
console.log(Vue.prototype.$token);
}
if(to.path == '/login'){
delete Vue.prototype.$userInfo;
delete Vue.prototype.$token;
delCookie('token','userInfo');
}
var token = getCookie('token');
if( to.path != '/login' && token=="")
next({ path: '/login' })
else
next()
})
router.afterEach(transition => {
// NProgress.done();
});
new Vue({
//el: '#app',
//template: '<App/>',
router,
store,
//components: { App }
render: h => h(App)
}).$mount('#app')
我的routes.js
import Login from './views/Login.vue'
import Home from './views/Home.vue'
let routes = [
{
path: '/login',
component: Login,
name: '',
hidden: true
},
{
path: '/',
component: Home,
name: '',
iconCls: 'fa fa-home',
leaf: true,//只有一個節(jié)點
children: [
{ path: '/index', component: Index, name: '首頁' }
]
}
]
export default routes;
原來的菜單欄只有首頁一個,我通過addRoutes()添加了一個系統(tǒng)設(shè)置的菜單,刷新菜單欄之后應(yīng)該有首頁和系統(tǒng)設(shè)置這兩個菜單,但為什么我新添加的系統(tǒng)設(shè)置這個菜單是沒有的呢?
我的Home.js
<aside :class="collapsed?'menu-collapsed':'menu-expanded'">
<!--導(dǎo)航菜單-->
<el-menu :default-active="$route.path" class="newMenu" @open="handleopen" @close="handleclose" @select="handleselect"
unique-opened router v-if="!collapsed" id="sidebar-hook">
<template v-for="(item,index) in $router.options.routes" v-if="!item.hidden">
<el-submenu :index="index+''" v-if="!item.leaf">
<template slot="title"><i :class="item.iconCls"></i>{{item.name}}</template>
<el-menu-item v-for="child in item.children" :index="child.path" :key="child.path" v-if="!child.hidden &&child.pri&& child.pri.indexOf($userInfo.roleType)!=-1">{{child.name}}</el-menu-item>
</el-submenu>
<el-menu-item v-if="item.leaf&&item.children.length>0" :index="item.children[0].path"><i :class="item.iconCls"></i>{{item.children[0].name}}</el-menu-item>
</template>
</el-menu>
<!--導(dǎo)航菜單-折疊后-->
<ul class="el-menu el-menu-vertical-demo collapsed" v-show="collapsed" ref="menuCollapsed">
<li v-for="(item,index) in $router.options.routes" v-if="!item.hidden" class="el-submenu item">
<template v-if="!item.leaf">
<div class="el-submenu__title" style="padding-left: 20px;" @mouseover="showMenu(index,true)" @mouseout="showMenu(index,false)"><i :class="item.iconCls"></i></div>
<ul class="el-menu submenu submenu-scroll-hook" :class="'submenu-hook-'+index" @mouseover="showMenu(index,true)" @mouseout="showMenu(index,false)">
<li v-for="child in item.children" v-if="!child.hidden" :key="child.path" class="el-menu-item" style="padding-left: 40px;" :class="$route.path==child.path?'is-active':''" @click="$router.push(child.path)">{{child.name}}</li>
</ul>
</template>
<template v-else>
<li class="el-submenu">
<div class="el-submenu__title el-menu-item" style="padding-left: 20px;height: 56px;line-height: 56px;padding: 0 20px;" :class="$route.path==item.children[0].path?'is-active':''" @click="$router.push(item.children[0].path)"><i :class="item.iconCls"></i></div>
</li>
</template>
</li>
</ul>
</aside>
運行程序之后,發(fā)現(xiàn)菜單欄沒有變化,但是手動輸入添加的地址是可以跳轉(zhuǎn)到頁面的
1.addroute已經(jīng)成功了,所以可以跳轉(zhuǎn)到新增的路由頁。
2.渲染menu不應(yīng)該遍歷路由去生成,因為addroutes后,路由雖然增加了,但路由不是響應(yīng)數(shù)據(jù)(未觀察,且未訂閱),是不會對你的視圖觸發(fā)變化的。
建議解決方案:
使用vuex,對路由信息進行狀態(tài)管理,把初始的路由數(shù)據(jù)存到store里,menu依靠store進行渲染及更新,addroutes后再把新增路由push進store存儲的路由數(shù)組中,即可以觸發(fā)menu更新。希望能解決你的問題。
// store 里面 把 根據(jù)權(quán)限過濾的異步路由和不需要權(quán)限的路由結(jié)合在一起,組成新的
SET_ROUTERS: (state, routers) => {
state.addRouters = routers
state.routers = constantRouterMap.concat(routers)
}
//view/layout/component/sildbar/index.js
// 替換
<sidebar-item v-for="route in routers" :key="route.name" :item="route" :base-path="route.path"/>
// 引入
...mapGetters([
'sidebar',
'routers'
]),北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。