vueRouter--matcher之動態(tài)增減路由方式
matcher之動態(tài)增減路由
優(yōu)化項目時,有個環(huán)節(jié)在主路由下,根據(jù)后端返回不同內容,需要修改動態(tài)路由。如果直接刪除原來路由,再addrouter新路由,發(fā)現(xiàn)原來的路由還是存在的。vue動態(tài)新增路由,沒有刪除功能(vue官方文檔好像沒有提供)。
解決辦法
使用matcher :
const createRouter = () => ?new Router({ ? ? routes: [{ ? ? ? ? ? ? path: '/', ? ? ? ? ? ? name: '登錄', ? ? ? ? ? ? component: login ? ? ? ? }] const router = createRouter() export function resetRouter () {? ?const newRouter = createRouter() ?router.matcher = newRouter.matcher } export default router
局部引入,在addrouter之前調用一次 resetRouter即可:
import {resetRouter} from '@/router' ?resetRouter(); ?this.$router.addRoutes(routeMenu);
番外
如果需要刪除添加一級路由下面單個子路由時,可以通過this.$router.options.routes獲取到路由數(shù)組,通過循環(huán)方式直接進行push或splice,然后再用上面的方法進行全局替換即可。
vueRouter動態(tài)追加路由
路由分為靜態(tài)路由,如事先寫好的,公共的路由,如:404、login等
還有一部分是根據(jù)權限接口返回,動態(tài)追加的一些頁面模塊路由,如:user
在處理權限的時候,可以先允許一些不需要權限認證的路由,如下:
// 開放的路由,可以直接訪問 const ALLOW_ROUTES = [ ? '/login', ? '/buy', ? // ... ];
具體路由攔截全在router.beforeEach里處理
首先如果沒有登錄,直接跳轉登錄頁
if (!ALLOW_ROUTES.includes(to.path) && !isLogin) { // 未登錄 ? next({ ? ? path: '/login', ? ? replace: true ? }); ? return; }
如果已登錄,使用router.addRoutes追加路由
if(isLogin && (sessionStorage.getItem('curPath') || to.matched[0].path === '*') ?) { ? sessionStorage.removeItem('curPath'); ? // 還原路由(防止路由重復) ? router.matcher = new VueRouter({ ? ? // mode: 'history', ? ? routes ? }).matcher; ? router.addRoutes(routes: Array<RouteConfig>); // 追加路由 ? // util.generateMenu(); // 生成菜單,視具體情況而定 ? next({ ? ? path: to.path ? }); ? return; }
動態(tài)添加更多的路由規(guī)則。參數(shù)必須是一個符合 routes 選項要求的數(shù)組。
curPath用于輔助處理
router.afterEach(to => { ? // 保存路徑 ? if (to.path !== '/login') { ? ? sessionStorage.setItem('curPath', JSON.stringify({ ? ? ? path: to.path ? ? })); ? } })
動態(tài)路由主要是根據(jù)業(yè)務來的,不好寫成一個公共的處理方式,具體在什么時候追加路由,要自己去判斷,如:刷新、退出登錄、重新登錄、沒有匹配到等操作是否滿足
如果還遇到路由重復的問題,可能是在當前頁push同樣路由造成的,這里可以先判斷一下
if(router.currentRoute.name !== 'login') { ? router.push({ ? ? name: 'login' ? }) }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解vue與后端數(shù)據(jù)交互(ajax):vue-resource
本篇文章主要介紹了詳解vue與后端數(shù)據(jù)交互(ajax):vue-resource,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03vue 解決uglifyjs-webpack-plugin打包出現(xiàn)報錯的問題
這篇文章主要介紹了vue 解決uglifyjs-webpack-plugin打包出現(xiàn)報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08