使用vuex+vue-router的时候,刷新后报错

场景:做后台的dashboard,使用element+vue+vuex+vue-router。就是一般的后台管理系统
已实现:登录后跳转首页,动态增加菜单和addRoutes。菜单可点。刷新后从localstorage里面获取token,个人信息等。刷新后菜单和个人信息添加到vuex的store。
问题:刷新后,addRoutes添加的路由失效,访问的时候报错

vue.common.js?e881:560 [Vue warn]: Error in beforeCreate hook: 
(found in <Dashboard> at H:\xxx\src\pages\common\dashboard.vue)

TypeError: Cannot read property 'call' of null

[Vue warn]: Failed to mount component: template or render function not defined. 
(found in <Dashboard> at H:\xxx\src\pages\common\dashboard.vue)

routes.js里面只有404和login,可以正常访问。

部分关键代码:
webpack

  resolve: {
    extensions: ['', '.js', '.vue', '.json'],
    fallback: [path.join(__dirname, '../node_modules')],
    alias: {
      'vue$': 'vue/dist/vue.common.js',
      'src': path.resolve(__dirname, '../src'),
      'assets': path.resolve(__dirname, '../src/assets'),
      'components': path.resolve(__dirname, '../src/components')
    }
  }

app.js:

if (!store.accessToken && localStorage.getItem('accessToken')) {
  store.commit('ADD_MENU', JSON.parse(localStorage.getItem('menu')))
  store.commit('ADD_ACCESSTOKEN', localStorage.getItem('accessToken'))
  store.commit('ADD_REFRESHTOKEN', localStorage.getItem('refreshToken'))
  store.commit('ADD_USER', JSON.parse(localStorage.getItem('user')))
  router.addRoutes(store.state.menu.items)
}

router.beforeEach((to, from, next) => {
  // console.log(to)
  let accessToken = localStorage.getItem('accessToken')
  if (to.path !== '/login') {
    if (!accessToken) {
      return next({
        path: '/login'
      })
    }
  }else if(to.path === '/login' && accessToken){
    return next({
      path: from.path
    })
  }
  next();
});

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app');

各种百度google之后,说是需要改webpack和new Vue的时候加render,我仔细看了一下,我都有。所以问题应该不是出在 独立构建vs运行时构建。stackoverflow和vue-router的issue里多半都是这个答案。
我的问题是刷新后才会出现,一开始加载时没问题的。只要不刷新,都是正常。
我的对应是在app.js里面,判断如果store里面没有token,localstorage里面有,说明是刷新,不是正常退出,我就去从localstorage里面取各种信息,存到vuex的store里面,并且addroutes。我也尝试了直接更改加载的routes.js文件,console出来之后,显示已经改了,但是还是会报同样的错。

谁来救救我。。。。。

阅读 8.7k
3 个回答

谢谢,已解决,追了好久的错。
我把请求回来的menu存到localstorage里面之后,render这个方法就没有了。
恩,看来component是不能存到localstorage里面的。
所以之后类似的刷新页面的请求,我都写成了重新请求服务器。
localstorage里面只存token了。

dashboard.vue贴出来看看

应该是你代码的判断有问题。当你刷新的时候,其实已经破坏了单页面应用的结构,在你出错的那个页面,它刷新加载数据的时候,是重新加载整个单页面系统,然后某个值娶不到,页面加载出错(当时我就这样,只有刷新的时候出错)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏