我想从外部API加载路由。某些用户可能没有访问模块的权限。
因此,我的导航栏进行了API调用,并返回了所有模块。这些模块对象包含视图文件的路径。
我试图创建一个小沙盒来重现该问题
https://codesandbox.io/s/vue-routing-example-i5z1h
如果您在浏览器中打开此URL
https://i5z1h.codesandbox.io/#/First
您将首先遇到以下错误
找不到网址/第一个
,但是在导航栏中单击第一个模块链接后,应该呈现第一个视图。
我认为问题与以下事实有关:页面在加载后尚未启动导航创建的事件,因此未找到模块页面。更改路由器URL后,导航组件有足够的时间将所有必需的路由添加到路由器。
如何在路由器通向第一条路由并响应404错误之前加载这些URL?
答案 0 :(得分:0)
此处的主要思想是异步加载路由,这意味着您必须将SPA的加载推迟到那时。在您的index.js
或main.js
中,您的代码应如下所示:
// Some functions are assumed and not defined in the below code.
import Vue from 'vue';
import VueRouter from 'vue-router';
// Application root component
import App from './App.vue';
import { getRoutes } from './api';
// Register Vue plugins
Vue.use(VueRouter);
// Make API call here
// Some animation before the app is fully rendered.
showLoader();
getRoutes(/* Optional User data */)
.then((routesData) => {
// Stop the animation
stopLoader();
return routesData;
})
.then((routesData) => {
// processRoutes returns an array of `RouteConfig`
const routes = processRoutes(routesData);
const router = new Router({
routes: [
...routes,
{
path: '*',
component: NotFound
}
]
});
})
.then((router) => {
const app = new Vue({
el: '#app',
router,
template: '<App/>',
components: { App }
});
});
此外,您还需要做一些事情:
navbar
组件不应负责进行API调用。您必须将其取出。$router.addRoutes()
方法。但这不足以满足您的需求。考虑到授权,它将不起作用。这不会阻止导航。为此,您仍然可以根据需要通过减少用户与应用程序交互的时间来部分加载应用程序,从而带来有意义的用户体验。