最近在做动态的菜单栏,但是发现VUE在生成实例的时候已经把router加载了,但是我想在用户登录之后,从后台的数据库里面查询到其拥有的菜单权限,然后返回到前端去动态加载路由,随后发现网上说vue-router2.2之后的addRoutes()是可以实现这个功能的,随机试了一下,但是出现了写问题,希望大神提点
我想现在前端测试下addRoutes()可以实现否,就打算手动给他传一个路由格式的内容,看看能不能行
我在main.js里面调用addRoutes()方法
const router = new VueRouter({ //全局变量router:routes
mode:'history',
routes
})
var a = [];
a.push(
{
path: '/',
component: require('@/views/Home.vue'),
name: '系统设置',
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,//只有一个节点
children: [
{ path: '/index', component: Index, name: '首页' }
]
}
]
export default routes;
原来的菜单栏只有首页一个,我通过addRoutes()添加了一个系统设置的菜单,刷新菜单栏之后应该有首页和系统设置这两个菜单,但为什么我新添加的系统设置这个菜单是没有的呢?
我的Home.js
<aside :class="collapsed?'menu-collapsed':'menu-expanded'">
<!--导航菜单-->
<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>
<!--导航菜单-折叠后-->
<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>
运行程序之后,发现菜单栏没有变化,但是手动输入添加的地址是可以跳转到页面的
1.addroute已经成功了,所以可以跳转到新增的路由页。
2.渲染menu不应该遍历路由去生成,因为addroutes后,路由虽然增加了,但路由不是响应数据(未观察,且未订阅),是不会对你的视图触发变化的。
建议解决方案:
使用vuex,对路由信息进行状态管理,把初始的路由数据存到store里,menu依靠store进行渲染及更新,addroutes后再把新增路由push进store存储的路由数组中,即可以触发menu更新。希望能解决你的问题。