javascript - 模块中定义的 Nuxt 动态路由
问题描述
一天中的好时光,
我在 Nuxt@2.0 遇到了非常奇怪的问题,如下所示:
- 创建模块并动态加载路由
- 使用侧边栏导航到页面 - 页面工作正常(显示内容等)
- 复制页面 url 并在新选项卡中打开它 - 404,但是,来自面包屑生成器的所有元数据都在那里(它解析路由名称并为面包屑创建条目)
所以,从技术上讲,nuxt 能够加载页面,但是,它实际上无法加载它(奇怪的措辞,但我不知道如何更好地描述它)。
使用的插件:
- nuxt@edge (2.0~)
- nuxt-i18n - 所有路由都附有
___locale
字符串,因此,例如:dashboard___en
,dashboard___es
,dashboard___ru
等
为了动态加载路由,使用以下plugin
内容(在插件下定义nuxt.config.js
):
import Vue from 'vue';
export default ({ app: { router } }) => {
const routingContext = require.context('../modules', true, /.routing.js$/);
routingContext.keys().map((file) => [file.replace(/(^.\/)|(\.js$)/g, ''), routingContext(file)]).reduce((pluginRoutes, [name, module]) => {
Vue.use(module, router);
}, {});
};
模块文件夹内的routing.js
文件如下所示:
import { backendRoute, routeNameGenerator } from '~/libs/helpers';
import config from '~/config';
import forEach from 'lodash.foreach';
import CompanyPage from './pages/company';
export function install (Vue, router, options = {}) {
let routes = [
{
path: backendRoute('namespace/module/company'),
name: routeNameGenerator('namespace.module.company'),
component: CompanyPage
}
];
let localizedRoutes = [];
forEach(routes, (route) => {
forEach(config.application.localization.supportedLocales, (locale) => {
let modifiedRoute = Object.assign({}, route);
modifiedRoute.name = route.name + '___' + locale;
localizedRoutes.push(modifiedRoute);
});
});
router.addRoutes(localizedRoutes);
}
生成正确路由名称和路由路径的助手如下:
/**
* Generate Backend Route
* @param { string } path
* @returns { string }
*/
export function backendRoute(path) {
let basePath = application.backend_prefix.rtrim('/');
let trimmedPath = path.ltrim('/');
return basePath + '/' + trimmedPath;
}
/**
* Generate route name compatible with nuxt
* @param routeName
* @returns {string}
*/
export function routeNameGenerator(routeName) {
let parts = routeName.split('.');
let backend = application.backend_prefix.replaceAll('/', '');
return [].concat(...[backend], ...parts).join('-');
}
正如我已经说过的,如果您通过实际遵循路由的路径导航到动态加载的路由,它将显示内容,但如果您想直接访问此路由,则会抛出 404 但面包屑会仍然会生成,因为路线有点加载,但同时它不是。
我已经检查了目录和动态页面this.$route
内页面的输出/pages
,它是相同的(显然不是路径和名称),所以在这一点上我不知道我加载路由的方式有什么问题。
非常感谢您的任何帮助,并感谢您的宝贵时间!
PS我不@nuxt\router
支持目录内文件的自动路由生成root\pages
。
更新#1:
有时,它偶尔会抛出Cannot read property 'layout' of undefined
错误
解决方案
推荐阅读
- typescript - 我在哪里可以获得“firebase”中某些模块的“类型”?
- node.js - 如何在使用 puppeteer 加载后迭代表元素?
- ios - UIColor 'NSKeyedUnarchiveFromData' 不应用于取消归档,并将在未来版本中删除
- php - 错误:不推荐使用 __autoload(),请使用 spl_autoload_register() 代替
- node.js - Cucumberjs 你如何将 world.js 分解成更小的文件
- python - 如何将变换方法应用于熊猫中的两个变量?
- r - 对列中的值求和并按 R 中的另一列分组
- android - 如何将 .onViewAdded 与约束布局一起使用
- python - Spyder4找不到seaborn包
- actions-on-google - 如何将“自由格式文本”类型从区分大小写更改?