Nextjs -许多页的第一级动态路由,每个页都有子级

fnatzsnv  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(147)

Nextjs -许多页的第一级动态路由,每个页都有子级
我有一个NextJS 12.2/React 18应用程序链接到CMS,用户可以在那里设置他们的自定义页面结构,内容和主题。

  • 在前端,将有一些API调用来获取应用程序设置和配置,包括页面层次结构。
  • 默认的六个顶级页面名称是主页、内容、事件、用户、搜索和博客。
  • 我们可以把这六个页面看作是类型,所以我们有六种不同的类型,用户可以更改这些类型的名称,但不能更改类型本身。正如你所预料的,更改名称将相应地更改URL段。
  • 这六种类型中的四种可以有多层(嵌套)子页面。以下是默认应用URL的一些示例:
mydomain.com/homepage 
     mydomain.com/content/
     mydomain.com/events/by-location/[locationID]
     mydomain.com/events/[eventID]
     mydomain.com/events/by-category/[catLevelOne]
     mydomain.com/user/profile 
     mydomain.com/blog/[postID]
     mydomain.com/search?term=searchterm
     mydomain.com/contact-us
  • 注意:还有一个静态页面“contact-us”未连接到CMS。
  • 要在NextJS路由方法中实现此模型,应用文件结构应如下所示(如果允许的话):
pages
    ├── [blog]
    │   ├── [postID].js
    │   └── index.js
    ├── [content]
    │   ├── [levelOne]
    │   │   ├── [levelTwo]
    │   │   │   ├── [levelThree]
    │   │   │   │   └── index.js
    │   │   │   └── index.js
    │   │   └── index.js
    │   └── index.js
    ├── [events]
    │   ├── by-category
    │   │   ├── [catLevelOne]
    │   │   │   ├── [catLevelTwo]
    │   │   │   │   └── index.js
    │   │   │   └── index.js
    │   │   └── index.js
    │   ├── by-location
    │   │   ├── [location]
    │   │   │   ├── [locationID].js
    │   │   │   └── index.js
    │   │   └── index.js
    │   ├── index.js
    │   └── [eventID].js
    ├── [user]
    │   ├── account.js
    │   ├── emailverification.js
    │   ├── password.js
    │   └── register.js
    ├── search.js
    └── homepage.js
  • 这是不可能的,因为我们不能有两个文件夹与括号在同一水平!
  • 如果我硬编码顶层页面的文件名,它们工作得很好,然而,当用户将其默认名称(主页,内容,事件等)更改为其他名称时,问题就开始了,NextJS然后将不知道页面的结构是什么,所以它通过404没有立即找到,因为从API获取文件结构需要几秒钟的时间。
    我尝试过的方法:

1.中间件:结果是我们无法在middleware.js中获取数据,如果我们这样做,每次路由更改时都会有数十次API调用。
1.我尝试了一个动态路由方法,所以我在服务器端的一个[wildcard].js文件中获取数据,然后根据返回的数据重写URL,以便根据页面类型(基本上是硬编码的页面名称)将请求路由到正确的方向。这样做很顺利,但只针对顶部页面,而不是其子页面。

gzjq41n4

gzjq41n41#

我知道我迟到了,但是如果有人还需要这个,我想你已经很接近了。使用shallow-routing和你的第二种方法应该可以完成这项工作。基本上添加[...wildcard].js
根据返回的数据,重写URL,以便根据页面类型以正确的方向路由请求
一个好主意是在getServerSideProps函数中执行此操作,因为您可以在那里发出请求,这样会更快,并且您不必担心页面加载时出现任何故障。
另外,如果有人有任何疑问:当然,我们不能有two folders with brackets on the same level,因为如果你有[id1][id2],nextJS怎么知道mydomain.com/1234应该是什么?现在有一种方法来判断1234id1还是id2
我想最后一部分可能很明显,但还是...以防有人想知道。

相关问题