一看就会的Next.js App Router版 -- Routing(下)(一)

简介: 一看就会的Next.js App Router版 -- Routing

Parallel Routes

平行路线

Parallel Routing allows you to simultaneously or conditionally render one or more pages in the same layout. For highly dynamic sections of an app, such as dashboards and feeds on social sites, Parallel Routing can be used to implement complex routing patterns.

并行路由允许您同时或有条件地在同一布局中呈现一个或多个页面。对于应用程序的高度动态部分,例如社交网站上的仪表板和提要,并行路由可用于实现复杂的路由模式。

For example, you can simultaneously render the team and analytics pages.

例如,您可以同时呈现团队和分析页面。

image.png

Parallel Routing allows you to define independent error and loading states for each route as they're being streamed in independently.

并行路由允许您为每条路由定义独立的错误和加载状态,因为它们是独立流式传输的。

image.png

Parallel Routing also allow you to conditionally render a slot based on certain conditions, such as authentication state. This enables fully separated code on the same URL.

并行路由还允许您根据某些条件(例如身份验证状态)有条件地呈现插槽。这可以在同一 URL 上启用完全分离的代码。

image.png

Convention

Parallel routes are created using named slots. Slots are defined with the @folder convention, and are passed to the same-level layout as props.

并行路由是使用命名槽创建的。插槽使用 @folder 约定定义,并传递到与 props 相同级别的布局。

Slots are not route segments and do not affect the URL structure. The file path /@team/members would be accessible at /members.

插槽不是路由段,不会影响 URL 结构。文件路径 /@team/members 可以在 /members 访问。

For example, the following file structure defines two explicit slots: @analytics and @team.

例如,以下文件结构定义了两个显式槽:@analytics 和@team。

image.png

The folder structure above means that the component in app/layout.js now accepts the @analytics and @team slots props, and can render them in parallel alongside the children prop:

上面的文件夹结构意味着 app/layout.js 中的组件现在接受 @analytics 和 @team slots 属性,并且可以与 children 属性一起并行渲染它们:

app/layout.tsx

javascript

export default function Layout(props: {  children: React.ReactNode;  analytics: React.ReactNode;  team: React.ReactNode;}) {  return (    <>      {props.children}      {props.team}      {props.analytics}    </>  );}

Good to know: The children prop is an implicit slot that does not need to be mapped to a folder. This means app/page.js is equivalent to app/@children/page.js.

提示:children 属性是一个隐式插槽,不需要映射到文件夹。这意味着 app/page.js 等同于 app/@children/page.js。

Unmatched Routes

无与伦比的路线

By default, the content rendered within a slot will match the current URL.

默认情况下,插槽中呈现的内容将与当前 URL 匹配。

In the case of an unmatched slot, the content that Next.js renders differs based on the routing technique and folder structure.

在插槽不匹配的情况下,Next.js 呈现的内容因路由技术和文件夹结构而异。

default.js

默认.js

You can define a default.js file to render as a fallback when Next.js cannot recover a slot's active state based on the current URL.

当 Next.js 无法根据当前 URL 恢复插槽的活动状态时,您可以定义一个 default.js 文件作为后备呈现。

Consider the following folder structure. The @team slot has a settings directory, but @analytics does not.

考虑以下文件夹结构。 @team 插槽有一个设置目录,但@analytics 没有。

image.png

If you were to navigate from the root / to /settings, the content that gets rendered is different based on the type of navigation and the availability of the default.js file.

如果您要从根 / 导航到 /settings,根据导航类型和 default.js 文件的可用性,呈现的内容会有所不同。

With @analytics/default.js Without @analytics/default.js
Soft Navigation @team/settings/page.js and @analytics/page.js @team/settings/page.js and @analytics/page.js
Hard Navigation @team/settings/page.js and @analytics/default.js 404

Soft Navigation

软导航

On a soft navigation - Next.js will render the slot's previously active state, even if it doesn't match the current URL.

在软导航上 - Next.js 将呈现广告位先前的活动状态,即使它与当前 URL 不匹配。

Hard Navigation

硬导航

On a hard navigation - a navigation that requires a full page reload - Next.js will first try to render the unmatched slot's default.js file. If that's not available, a 404 gets rendered.

在硬导航(需要重新加载整页的导航)中,Next.js 将首先尝试呈现不匹配的插槽的 default.js 文件。如果这不可用,则会呈现 404。

The 404 for unmatched routes helps ensure that you don't accidentally render a route that shouldn't be parallel rendered.

不匹配路由的 404 有助于确保您不会意外渲染不应并行渲染的路由。

useSelectedLayoutSegment(s)

在 SelectedLayoutSegment(s)

Both useSelectedLayoutSegment and useSelectedLayoutSegments accept a parallelRoutesKey, which allows you read the active route segment within that slot.

useSelectedLayoutSegment 和 useSelectedLayoutSegments 都接受一个 parallelRoutesKey,它允许您读取该插槽中的活动路由段。

app/layout.tsx

"use client";import { useSelectedLayoutSegment } from "next/navigation"; export default async function Layout(props: {  ...  authModal: React.ReactNode;}) {  const loginSegments = useSelectedLayoutSegment("authModal")  ...}

When a user navigates to @authModal/login, or /login in the URL bar, loginSegments will be equal to the string "login".

当用户导航到 @authModal/login 或 URL 栏中的 /login 时,loginSegments 将等于字符串“login”。

Examples

例子

Modals

模态

Parallel Routing can be used to render modals.

并行路由可用于渲染模态。

image.png

The @authModal slot renders a<Modal> component that can be shown by navigating to a matching route, for example /login.

@authModal 插槽呈现一个  组件,可以通过导航到匹配的路由(例如 /login)来显示该组件。

app/layout.tsx

export default async function Layout(props: {  ...  authModal: React.ReactNode;}) {  return (    <>      ...      {props.authModal}    </>  );}

app/@authModal/login/page.tsx

import { Modal } from 'components/modal'; export default function Login() {  return (    <Modal>      <h1>Login</h1>      ...    </Modal>  );}

To ensure that the contents of the modal don't get rendered when it's not active, you can create a default.js file that returns null.

为确保模式的内容在未处于活动状态时不会呈现,您可以创建一个返回 null 的 default.js 文件。

app/@authModal/login/default.tsx

javascript

复制代码

exportdefaultfunctionDefault() {  returnnull;}

Dismissing a modal

关闭模态

If a modal was initiated through client navigation, e.g. by using <Link href="/login">, you can dismiss the modal by calling router.back() or by using a Link component.

如果模式是通过客户端导航启动的,例如通过使用 ,您可以通过调用 router.back() 或使用 Link 组件关闭模态。

app/@authModal/login/page.tsx

'use client';import { useRouter } from 'next/navigation';import { Modal } from 'components/modal'; export default async function Login() {  const router = useRouter();  return (    <Modal>      <span onClick={() => router.back()}>Close modal</span>      <h1>Login</h1>      ...    </Modal>  );}
More information on modals is covered in the Intercepting Routes section.

有关模式的更多信息,请参阅拦截路由部分。

If you want to navigate elsewhere and dismiss a modal, you can also use a catch-all route.

如果你想导航到别处并关闭模态,你也可以使用 catch-all 路由。

image.png

app/@authModal/[...catchAll]/page.js

export default function CatchAll() {  return null;}

Catch-all routes take presedence over default.js.

Catch-all 路由优先于 default.js。

Conditional Routes

条件路由

Parallel Routes can be used to implement conditional routing. For example, you can render a @dashboard or @login route depending on the authentication state.

Parallel Routes 可用于实现条件路由。例如,您可以根据身份验证状态呈现 @dashboard 或 @login 路由。

app/layout.tsx

import { getUser } from '@/lib/auth'; export default function Layout({ params, dashboard, login }) {  const isLoggedIn = getUser();  return isLoggedIn ? dashboard : login;}

image.png

Intercepting Routes

拦截路线

Intercepting routes allows you to load a route within the current layout while keeping the context for the current page. This routing paradigm can be useful when you want to "intercept" a certain route to show a different route.

拦截路由允许您在当前布局中加载路由,同时保留当前页面的上下文。当您想“拦截”某条路线以显示不同的路线时,此路由范例会很有用。

For example, when clicking on a photo from within a feed, a modal overlaying the feed should show up with the photo. In this case, Next.js intercepts the /feed route and "masks" this URL to show /photo/123 instead.

例如,当从提要中单击照片时,覆盖提要的模式应该与照片一起显示。在这种情况下,Next.js 拦截 /feed 路由并“屏蔽”此 URL 以显示 /photo/123。

image.png

However, when navigating to the photo directly by for example when clicking a shareable URL or by refreshing the page, the entire photo page should render instead of the modal. No route interception should occur.

然而,当直接导航到照片页面时,例如通过单击可共享的URL或刷新页面时,应该渲染整个照片页面而不是模态框。不应进行路由拦截。

image.png

Convention

Intercepting routes can be defined with the (..) convention, which is similar to relative path convention ../ but for segments.

拦截路由可以使用 (..) 约定来定义,这类似于相对路径约定 ../ 但用于段。

You can use:

您可以使用:

  • (.) to match segments on the same level
  • (.) 匹配同一级别的段
  • (..) to match segments one level above
  • (..) 匹配上一级的段
  • (..)(..) to match segments two levels above
  • (..)(..) 匹配上两层的段
  • (...) to match segments from the rootapp directory
  • (...) 匹配根应用程序目录中的段

For example, you can intercept the photo segment from within the feed segment by creating a (..)photo directory.

例如,您可以通过创建 (..)photo 目录从提要段中拦截照片段。

image.png

Note that the (..) convention is based on route segments, not the file-system.

请注意, (..) 约定基于路由段,而不是文件系统。

Examples

Modals

模态

Intercepting Routes can be used together with Parallel Routes to create modals.

拦截路由可以与并行路由一起使用来创建模态。

Using this pattern to create modals overcomes some common challenges when working with modals, by allowing you to:

使用此模式创建模态可以克服使用模态时的一些常见挑战,它允许您:

  • Make the modal content shareable through a URL
  • 让模态内容可以通过URL共享
  • Preserve context when the page is refreshed, instead of closing the modal
  • 在页面刷新时保留上下文,而不是关闭模态
  • Close the modal on backwards navigation rather than going to the previous route
  • 在向后导航时关闭模态,而不是转到前面的路线
  • Reopen the modal on forwards navigation
  • 重新打开前向导航的模式

image.png

In the above example, the path to the photo segment can use the (..) matcher since @modal is a slot and not a segment. This means that the photo route is only one segment level higher, despite being two file-system levels higher.

在上面的示例中,照片片段的路径可以使用 (..) 匹配器,因为 @modal 是一个插槽而不是片段。这意味着照片路由只高了一个段级别,尽管它是两个文件系统级别。

Other examples could include opening a login modal in a top navbar while also having a dedicated /login page, or opening a shopping cart in a side modal.

其他示例可能包括在顶部导航栏中打开登录模式,同时还具有专用的 /login 页面,或在侧面模式中打开购物车。

View an example of modals with Intercepted and Parallel Routes.

查看示例

具有拦截和平行路线的模态。

目录
相关文章
|
30天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
504 1
|
2月前
|
监控 JavaScript 前端开发
深入理解 Nuxt.js 中的 app:error 钩子
【9月更文挑战第25天】在 Nuxt.js 中,`app:error` 钩子是一个强大的工具,用于处理应用程序中的各种错误。它可以在服务器端渲染或客户端运行时触发,帮助提升应用稳定性和用户体验。通过在 `nuxt.config.js` 中定义该钩子,开发者可以实现错误页面显示、错误日志记录及错误恢复等功能,确保应用在遇到问题时能妥善处理并恢复正常运行。
48 10
|
3月前
|
资源调度 JavaScript Linux
【Azure 应用服务】本地Node.js部署上云(Azure App Service for Linux)遇到的三个问题解决之道
【Azure 应用服务】本地Node.js部署上云(Azure App Service for Linux)遇到的三个问题解决之道
|
2月前
|
开发者 UED
深入理解 Nuxt.js 中的 app:error 钩子
【9月更文挑战第26天】在 Nuxt.js 中,钩子函数是在特定生命周期阶段执行代码的机制,`app:error` 钩子用于处理应用中的错误,包括服务器端和客户端渲染时出现的问题。它提供了一个集中处理错误的机制,提升了用户体验。当组件渲染过程中出现错误时,`app:error` 钩子会被触发,可以在 `nuxt.config.js` 文件中定义该钩子。通过分析错误对象 `err` 和上下文信息 `context`,开发者可以更好地处理各种错误情况。相比组件内的 `try/catch` 或浏览器原生错误处理,`app:error` 提供了更全局和有针对性的错误处理方式。
|
3月前
|
JavaScript 前端开发
【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户名示例
【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户名示例
|
3月前
|
JavaScript 前端开发 UED
揭秘Vue.js高效开发:Vue Router如何让单页面应用路由管理变得如此简单?
【8月更文挑战第30天】随着Web应用复杂性的增加,单页面应用(SPA)因出色的用户体验和高效的页面加载性能而备受青睐。Vue.js凭借简洁的语法和灵活的组件系统成为构建SPA的热门选择,其官方路由管理器Vue Router则简化了路由管理。本文通过实战示例介绍如何利用Vue Router实现高效的SPA路由管理,包括命名路由、动态路由及其核心优势。
35 0
|
3月前
|
JavaScript Windows
【Azure 应用服务】用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢?
【Azure 应用服务】用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢?
|
3月前
|
开发框架 JavaScript 前端开发
【Azure Developer】App Service + PubSub +JS 实现多人版黑客帝国文字流效果图
【Azure Developer】App Service + PubSub +JS 实现多人版黑客帝国文字流效果图
|
3月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的成人教育APP附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的成人教育APP附带文章源码部署视频讲解等
54 2

热门文章

最新文章