鍍金池/ 問答/HTML/ 關(guān)于vue-router 路由守衛(wèi)的問題

關(guān)于vue-router 路由守衛(wèi)的問題

再做一個(gè)權(quán)限管理模塊,現(xiàn)在的思路是,我登錄的時(shí)候,直接生成了router
下面的代碼

  LoginByUsername({dispatch, commit, state}, loginForm) {
    const username = loginForm.username.trim()
    return new Promise((resolve, reject) => {
      loginByUsername(username, loginForm.password).then(response => {
        const data = response.result
        const meta = response.meta
        commit(SET_NAME, data.name)
        commit(SET_MENUFLAT, meta.flatMenus)
        commit(SET_MENUTREE, meta.treeMenus)
        /*登錄的時(shí)候就直接生成好路由*/
        dispatch('generateRoutes').then((asyncRoute) => {
          console.log(state.addRouters)
          router.addRoutes(state.addRouters)
        })
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

這里通過router.addRoutes生成了可訪問的路由。
一開始登錄是沒問題的,登錄之后,點(diǎn)擊菜單欄可以正常跳轉(zhuǎn)。

但是如果這個(gè)時(shí)候,在瀏覽器在瀏覽器地址欄目按下回車或者刷新,那么路由就失效了


router.beforeEach((to, from, next) => {
  /*進(jìn)行路由跳轉(zhuǎn)的時(shí)候,肯定已經(jīng)設(shè)置好getters了*/

  NProgress.start()
  /*如果有token,說(shuō)明已經(jīng)登錄過了*/
  if (getToken()) {
    /*如果登錄過了還訪問logn頁(yè)面就直接跳轉(zhuǎn)首頁(yè)*/
    if (to.path === '/login') {
      next({path: '/'})
      NProgress.done()
    } else {
      next()
      NProgress.done()
    }
  } else {
    if (WhiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
      NProgress.done()
    }
  }
})

打斷點(diǎn)發(fā)現(xiàn),刷新瀏覽器之后,這里攔截的to 沒有match匹配的地址。這是為什么呢

求解惑

回答
編輯回答
旖襯

問題是由于刷新頁(yè)面之后addRoutes的路由失效了,所以判斷下,然后重新生成路由

2018年2月23日 04:37