You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13 App目录动态路由出现404 Not Found错误求助

Next.js 13 App目录动态路由404问题解决

问题场景

用Next.js 13结合TypeScript开发待办应用,定义了包含listId(字符串)和listName(字符串)的对象数组,通过map遍历生成Link组件,href设置为/listId/${list.listId},期望导航到对应页面并获取ID,但预获取和跳转时出现404错误,首次使用App目录项目,对TypeScript不熟悉。

父页面代码

<div className='flex flex-col gap-2 py-2 pb-4'>
  { allLists.length > 0 && allLists.map((list: IList, index: number) => (
      <Link key={index} href={`/listId/${list.listId}`}
        className='border border-dashed border-gray-500 text-gray-800 px-3 py-1 rounded-lg'>
        <p>{ list.listName }</p>
      </Link>
  ))}
</div>

原ListId页面代码(服务端组件)

interface IParams {
  listId: string
}

const ListNamePage: FC<IParams> = ({ listId }): ReactElement => {
  const router = useRouter();
  const { listName } = router.query;
  console.log(listName);
  
  return (
    <div>ListNamePage</div>
  )
}

export default ListNamePage

解决步骤

  • 修正路由目录结构
    Next.js 13 App目录的动态路由要求用[参数名]命名文件夹。你需要创建这样的目录结构:app/listId/[listId]/page.tsx,把ListId页面的代码放在这个page.tsx文件里。之前的目录结构不符合App路由规则,导致无法匹配路径,出现404。

  • 调整页面参数获取逻辑
    App目录的服务端组件不能使用useRouter(这是Pages目录的API),应该直接从组件的params参数中获取动态路由值,组件写法也不需要FC类型:

修改后的app/listId/[listId]/page.tsx代码:

// 定义参数类型
interface PageParams {
  params: {
    listId: string;
  };
}

export default function ListNamePage({ params }: PageParams) {
  // 直接获取动态路由的listId
  console.log('当前列表ID:', params.listId);

  return <div>ListNamePage - 当前列表ID: {params.listId}</div>;
}
  • 确认Link路径正确性
    你的Link组件href写法/listId/${list.listId}是正确的,只要目录结构符合要求,就能正确匹配到动态路由页面。

  • TypeScript类型补充
    确保allLists的类型定义正确:

interface IList {
  listId: string;
  listName: string;
}

// 示例:allLists的类型
const allLists: IList[] = [
  { listId: '1', listName: '购物清单' },
  { listId: '2', listName: '工作任务' }
];

内容的提问来源于stack exchange,提问作者daniel sas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:52:43