Vue Router:保留查询参数并为子

时间:2017-07-13 21:42:09

标签: vuejs2 vue-router

我用Vue重写现有的Angular 1应用程序。

应用始终需要在输入任何视图之前按localeidtoken对用户进行身份验证。尊重API的约定,我在我的主父路由中将token指定为查询参数。

来自现有的Angular的UI路由器实现,我认为这是要走的路:

// main.js
new Vue({
  el: '#app',
  router,
  store,
  template: '<router-view name="main"></router-view>'
})

// router.js
const router = new Router({
  mode: 'history',
  routes: [
    {
      name: 'start',
      path : '/:locale/:id', // /:locale/:id?token didn't work
      query: {
        token: null
      },
      beforeEnter (to, from, next) {
        // 1. Get data from API via locale, id and token
        // 2. Update store with user data
      },
      components: {
        main: startComponent
      },
      children: [{
        name: 'profile',
        path: 'profile',
        components: {
          main: profileComponent
        }
      }]
    }
  ]
})    

当我导航到profile视图时,我希望视图更改并保留查询令牌,例如/en-US/123?token=abc/en-US/123/profile?token=abc。都没有发生。

我正在使用Vue 2.3.3和Vue Router 2.3.1。

问题:

  • 导航到子路径时,我可以保留查询参数吗?
  • 我在这里使用Vue路由器吗?或者我是否需要责怪我的UI路由器偏见?

1 个答案:

答案 0 :(得分:13)

您可以在Router

的全局挂钩中解决此问题
import VueRouter from 'vue-router';
import routes from './routes';

const Router = new VueRouter({
  mode: 'history',
  routes
});

function hasQueryParams(route) {
  return !!Object.keys(route.query).length
}

Router.beforeEach((to, from, next) => {
   if(!hasQueryParams(to) && hasQueryParams(from)){
    next({name: to.name, query: from.query});
  } else {
    next()
  }
})

如果新路线(to)没有自己的参数,那么它们将从之前的路线(from)中取出