vue實現三級頁面跳轉功能
問題描述:在二級頁面點擊按鈕,打開新的標簽頁
實現:
在router目錄下的index.js文件添加對應組件
{ path: '/offices', component: <strong>'Layout'</strong><strong>,</strong> hidden: true, redirect: 'noRedirect', permission: 'sys:office:launch', meta: { title: '辦公管理',roles: ['sys:office'] }, children: [ { path: '/flows', component: <strong>'/office/launch/flows'</strong><strong>,</strong> name: 'flows', hidden: true, meta: { title: '轉正', activeMenu: '/office/launch' } }, ] }
說明:上述黃色標記部分代碼和以外自定義的component不一樣,主要原因是自定義路由解析方法所致
修改store目錄下permission.js
以下是之前定義的方法,該方法主要是生成從後端返回來的對應菜單的路由信息
export function filterAsyncRoutes(routes, roles) { const res = [] routes.forEach(route => { const tmp = { ...route } if (hasPermission(roles, tmp)) { // 獲取組件 const component = tmp.component // 判斷該路由使用組件 if(route.component){ // 判斷是否是根組件 if(component === 'Layout'){ tmp.component = Layout tmp.redirect = 'noRedirect' }else{ // 獲取對應的具體組件信息 tmp.component = (resolve) => require([`@/views${component}`],resolve) } } // 判斷是否有子菜單 if(tmp.children){ const child = tmp.children child.forEach(e => { e.path = tmp.path + e.path }) tmp.children = filterAsyncRoutes(tmp.children, roles) } res.push(tmp) } }) return res }
const actions = { // 動態生成路由 generateRoutes({ commit }, roles) { return new Promise((resolve,reject) => { getMenuList().then(res=>{ let accessedRoutes;//存放對應權限的路由信息 //如果狀態碼為200,則表示成功 if(res.code === 200){ accessedRoutes = filterAsyncRoutes(res.data, roles) } //將路由信息保存到store中 commit("SET_ROUTES",accessedRoutes); resolve(accessedRoutes); }).catch(error=>{ reject(error); }); }) } }
修改之後的方法
export function filterAsyncRoutes(routes, roles, <strong>type = false</strong>) { const res = [] routes.forEach(route => { const tmp = { ...route } if (hasPermission(roles, tmp)) { // 獲取組件 const component = tmp.component // 判斷該路由使用組件 if(route.component){ // 判斷是否是根組件 if(component === 'Layout'){ tmp.component = Layout tmp.redirect = 'noRedirect' }else{ // 獲取對應的具體組件信息 tmp.component = (resolve) => require([`@/views${component}`],resolve) } } // 判斷是否有子菜單 if(tmp.children){ const child = tmp.children child.forEach(e => { e.path = tmp.path + e.path }) tmp.children = filterAsyncRoutes(tmp.children, roles, false) } if(type && roles.includes(tmp.permission) || tmp.permission === 'all'){ res.push(tmp) }else if(!type){ res.push(tmp) } } }) return res }
const actions = { // 動態生成路由 generateRoutes({ commit }, roles) { return new Promise((resolve,reject) => { getMenuList().then(res=>{ let accessedRoutes;//存放對應權限的路由信息 //如果狀態碼為200,則表示成功 if(res.code === 200){ accessedRoutes = filterAsyncRoutes(res.data, roles, false) // asyncRoutes 該參數就是上面添加的路由信息 accessedRoutes = accessedRoutes.concat(filterAsyncRoutes(asyncRoutes,roles,true)) } //將路由信息保存到store中 commit("SET_ROUTES",accessedRoutes); resolve(accessedRoutes); }).catch(error=>{ reject(error); }); }) } }
黃色部分就是新增部分
修改面包屑和標簽名
title: view.query && view.query.metaTitle?view.query.metaTitle:(view.meta.title || 'no-name')
推薦閱讀:
- vue實現動態路由詳細
- vue2模擬vue-element-admin手寫角色權限的實現
- 使用vue-element-admin框架從後端動態獲取菜單功能的實現
- vue動態菜單、動態路由加載以及刷新踩坑實戰
- vue一步到位的實現動態路由