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

Next.js 14路由链接问题:如何跳转至components下的Login页面?

问题:Next.js 14跨文件夹页面跳转的路由问题

我正在使用Next.js 14,遇到了路由链接规则的问题。查阅文档后没找到跨文件夹页面跳转的相关说明,想点击首页page.tsx里的「Get started」链接,跳转到components/login目录下的page.tsx页面。下面是我的项目结构和代码,请问必须修改文件夹结构才能实现吗?

项目结构

app
| -- components
  |---login
    |----page.tsx
page.tsx

首页page.tsx代码

import Link from 'next/link';
import Image from 'next/image';

export default function Home() {
  return (
    <main className="flex min-h-screen">
      <div className="relative w-1/2">
        <Image
          src="/logo.png"
          alt="SIMS Logo"
          fill
          priority
          className="object-cover"
        />
      </div>

      <div className="w-1/2 flex flex-col items-center justify-center bg-gray-50 p-6">
        <h1 className="text-4xl font-bold mb-4">Welcome to SIMS</h1>
        <p className="text-xl text-gray-600 mb-8">Manage Your Materials, Master Your Lessons</p>
        <Link 
        href = "/Login"
        className="px-6 py-3 bg-indigo-600 text-white rounded-md hover:bg-indigo-700 transition-colors"
        >
          Get started
        </Link>
      </div>
    </main>
  );
}

Login页面page.tsx代码

import React from 'react';
import RoleButton from '../RoleButton/rolebutton';

export default function Login() {
    return (
        <div className="min-h-screen flex flex-col items-center justify-center">
            <div className="max-w-md w-full mx-auto px-4"> {/* Changed from max-w-2xl to max-w-md */}
                <h1 className="text-3xl font-bold text-gray-800 sm:text-5xl mb-8 text-center">
                    Select Your Role
                </h1> 
                <div className="grid grid-cols-1 sm:grid-cols-3 gap-2 max-w-lg mx-auto"> {/* Changed gap-4 to gap-2 and max-w-3xl to max-w-lg */}
                    <RoleButton role="admin" title="Admin" />
                    <RoleButton role="stock_manager" title="Stock Manager" />
                    <RoleButton role="teacher" title="Teacher" />
                </div>
            </div>
        </div>
    );
}

解决方案

首先明确:Next.js 14的App Router规则里,只有app目录下直接嵌套的文件夹(以及内部的page.tsx)才会被识别为可访问的路由页面。你现在把login/page.tsx放在components文件夹里,这个位置不属于路由目录,所以根本无法通过/Login或其他路径直接访问。

给你两种解决方式:

方案一:调整文件夹结构(推荐,符合框架规范)

把login文件夹从components移动到app目录下,调整后的结构如下:

app
| -- components
| -- login
|    |----page.tsx
page.tsx

调整后,/login路径会自动映射到app/login/page.tsx。同时要修改首页Link的href为"/login"(注意Next.js路由是大小写敏感的,之前的/Login要改成全小写)。

这种方式完全符合Next.js的设计逻辑——components文件夹本来就是用来存放可复用组件的,路由页面应该放在app目录的直接子文件夹下,这样后续维护路由时不会混乱。

方案二:保持现有结构,通过中转页面实现(不推荐)

如果实在不想改结构,可以在app目录下新建login/page.tsx,然后在这个文件里导入components/login/page.tsx的Login组件进行渲染:

// app/login/page.tsx
import Login from '@/app/components/login/page';

export default function LoginPage() {
  return <Login />;
}

同样需要把首页Link的href改成"/login"。不过这种方式相当于绕了个圈子,不符合框架的路由设计意图,不建议长期使用。


内容的提问来源于stack exchange,提问作者Daniella Nwambu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:33:26