拦截路由nextjs不渲染Modal

问题描述 投票:0回答:2

当尝试使用 nextjs 新应用程序路由器的拦截路由功能将其与 Modal 一起使用时,Modal 永远不会被渲染,只有 url 发生变化。


我的项目结构如下所示:

  • /应用程序
    • @模态
      • (.)用户
        • [id]
          • page.js
    • 用户
      • [id]
        • page.js
    • page.js

根 page.js 包含链接到 /user/someUUID 的组件。单击该链接时,仅 URL 发生变化,而模态框永远不会呈现。

我使用此示例代码作为参考:https://github.com/vercel-labs/nextgram

效果非常好。我使用示例中完全相同的模态组件。


我的/@modal/(.)user/[id]/page.js:

'use client'

import Modal from "../../../../components/modal"

export default function UserModal({ params: { id: userId } }) {
    alert("in modal page")

    return (
        <Modal>
            <p>{userId}</p>
        </Modal>
    )
}

我的/user/[id]/page.js:

'use client'

export default function UserPage({ params }) {

    return (
        <p>{params.id}</p>
    )
}

模态页面中的警报永远不会触发,但页面会被编译。我没有收到警告或错误或任何其他信息。有谁知道我在这里缺少什么?

routes next.js modal-dialog nextjs13 app-router
2个回答
2
投票

如果您查看此处的 vercel 示例,该模型将作为

prop

传递到布局文件
export default function Layout(props) {
  return (
    <html>
      <body>
        <GithubCorner />
        {props.children}
        {props.modal}
      </body>
    </html>
  );
}

0
投票
  1. 您应该在应用程序文件夹中创建 layout.js ,然后在子属性之后/之前调用模态属性,因为您使用 @modal 作为插槽并尝试将 (.)useruser 匹配。
  2. 然后在 @modal 文件夹中创建 default.js 文件并使其返回 null 以确保模式的内容在不活动时不会被渲染。

layout.js

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

默认.js

export default function Default() {
  return null
}

你的项目结构应该是这样的:

  • /应用程序
    • @模态
      • (.)用户
        • [编号]
          • page.js
      • 默认.js
    • 用户
      • [编号]
        • page.js
    • page.js
    • 布局.js
© www.soinside.com 2019 - 2024. All rights reserved.