【发布时间】:2020-07-04 19:00:43
【问题描述】:
基本上,我正在尝试为匹配的路由动态选择一个组件,或者进行内部重写,这样我就可以在不更改 url 的情况下选择不同的路由。
我现在的解决方案:
我有来自我想要匹配的外部资源的 url,我正在使用 _.js 在 Nuxt 中使用通配符页面捕获这些。在此页面上的中间件中,我将确定它应该是页面的实际类型(cmspage、productdetail 等)并将结果放入存储中。然后我会检查是否在 validate 函数中找到数据,以便在需要时返回 404。如果成功,将使用渲染函数渲染components/pages/cms.vue 或任何类型的页面。
所以这应该可以工作(仍然需要大部分实现)但是它有一个问题是我不能使用很多可用的 Nuxt 功能(中间件、asyncData、获取、验证等等?)这正是我想要实现的页面。
这个 nuxt 配置扩展不起作用,但会很完美:
{
router: {
extendRoutes(routes, resolve) {
routes.push({
path: '*',
component: async () => {
const pageType = 'pdp' // await getPageType()
switch (pageType) {
case 'cms':
return resolve(__dirname, 'pages/cmsPage.vue')
case 'pdp':
return resolve(__dirname, 'pages/productDetailPage.vue')
case 'plp':
return resolve(__dirname, 'pages/productListPage.vue')
}
}
})
}
}
}
【问题讨论】:
-
如何确定应该显示哪个页面?什么决定了
pageType?。 URL 是否确定要显示的页面类型? -
@ajobi,是的,该 url 被发送到 magento 和 drupal 以检查他们是否可以解决它,从而确定它是 cms、product 还是 productlistpage。
-
好的,他们是如何确定的?他们可能会解析 url 寻找蛞蝓等吗?
-
我相信他们有一个 db 表,他们可以在其中查找完整的 slug,因此我无法匹配特定 url 结构上的页面类型。
-
你确定吗?因为那将是解决它的明显且正确的方法。我看不出为什么一个产品应该在
product/product-name之下,而另一个产品应该在一个完全不同的 slug 之下
标签: javascript vue.js vue-router nuxt.js