二、Nextjs 最新版本的应用路由教程

待兔
• 阅读 1554

Nextjs 最新版本的应用路由教程

本文基于nextjs的最新版本 14.2.5

Nextjs 最新版本的优点

Nextjs 在13版本以后,新增加了 app router ,官方建议用这个

相对于之前的 pages ,是有一定的好处的。如下

  1. React Server Component , 服务器组件 , React 组件首次能够在服务器上单独运行。

    在 Next.js 13 中,文件默认是服务器组件。您可以通过在模块顶部包含 'use client' 指令来选择使用客户端组件。

    如果您还不了解客户端组件 和 服务器组件的区别,强烈推荐文章:理解React服务器组件,这篇文章详细解释了为什么需要引入新的概念:服务器组件,以及客户端组件和服务端组件的边界问题,开发中容易混淆的概念等等,非常值得一看

  2. 获取数据方式更简洁

​ 借助新的 App Router,我们的页面可以使用 React Server 组件,这使我们能够使用熟悉的 async/await语法来简化数据获取。 如下代码:

// app/page.tsx
export default async function Page() {
  const res = await fetch('https://www.helloworld.net');
  const data = res.json();
  return '...';
}
  1. 新的路由规范

二、Nextjs 最新版本的应用路由教程

新的路由规范通过为布局页面模板等强制使用特殊文件名,比如layout.tsx, template.tsx, page.tsx

解决了之前版本中所有文件都作为路由,

无法在pages/ 下声明不作为路由的文件,使开发体验变得更好。

路由相关

现在最新的 nextjs 版本为 14.2.5 , 我们以最新的版本为例子。讲解一下路由的用法

路由是一个框架中,最重要的部分也是最基础的部分。

下面讲解一下最常用的路由配置, 以App Router 为例。

注:下面讲解的是用了typescript ,所以直接创建的文件都是 tsx 文件。

路由放在哪个目录下?

创建nextjs 项目的时候,自带了一个 app 目录,此目录就是应用程序的目录,放路由的地方

注:app 目录在根目录下,没有此目录的可以自己手动创建。

首页怎么配置

app 目录下,创建一个 page.tsx 文件 。文件:/app/page.tsx 的代码如下

export default function Page() {
  return (
    <div>
      <p>helloworld社区首页</p>
    </div>
  );
}

执行npm run dev 命令,项目跑起来后,在浏览器中访问 :http://localhost:3000 ,如下

二、Nextjs 最新版本的应用路由教程

about页面

app目录下,创建 about目录 ,在about目录下创建page.tsx , 文件:/app/about/page.tsx ,代码如下:

export default function About(){
    return(
        <p>关于页面</p>
    )
}

访问:http://localhost:3000/about

二、Nextjs 最新版本的应用路由教程

带参数路由

有这样的一个URL : https://www.helloworld.net/blog/123

其中 123 是博客的 id , 这个id是动态变化的,如何创建相应的路由?

简单,如下:

app目录下创建blog目录, 在blog目录下创建[id]目录,在 [id] 目录下创建 page.tsx文件

文件路径为:/app/blog/[id]/page.tsx , 在page.tsx文件中,可以接收到路由参数,解析出id

代码如下:/app/blog/[id]/page.tsx 代码如下:

export default function Page({ params }: { params: { id: string } }) {
  return <p>博客id={params.id}</p>;
}

访问http://localhost:3000/blog/123

二、Nextjs 最新版本的应用路由教程

注:上面的 [id] 目录,名字可以随便起,也可以叫 [name] ,这样接受参数的时候,就是params.name

路由组

可以把目录的名字命名为带()的,如,在app 目录下,创建一个 (shop) 目录,在(shop)目录下创建其它的目录

此时,(shop)就是一个组路由,而且有一个特点:就是 shop 不会出现在路径中。

如下图

二、Nextjs 最新版本的应用路由教程 创建了一个路由组 shop, 下面有2个目录,也就是对应两个路由

所以访问的路径 对应的分别是:

  • http://localhost:3000/phone
  • http://localhost:3000/compter

注:路由组不能和上面的路由一样,比如在 app 目录下直接创建了一个目录 phone,

那么这样就冲突,因为两个路由访问的路径 都是 http://localhost:3000/phone

就会报错,所以注意不要有两个一样的路径 。

404 页面放在哪?

直接在app 目录下,创建一个文件,名字叫:not-found.tsx , 此文件代码如下:

export default function NotFound() {
  return (
    <div>
      <h2>404 Not Found</h2>
    </div>
  )
}

比如访问一个不存在的路径 http://localhost:3000/abc123 , 结果如下

二、Nextjs 最新版本的应用路由教程

layout 相关

所谓layout,就是不同页面之间,可以共享布局,就是一种共享UI的方式而已

如下图,我们在 app 目录下,创建 dashboard 目录,在下面再创建 setting 目录,

再在dashboard下面再创建一个page.tsx 文件

如下图:

二、Nextjs 最新版本的应用路由教程

上图中, dashboard 目录下,有两条路由,分别是:

  • http://localhost:3000/dashboard
  • http://localhost:3000/dashboard/setting

这两个页面,如何共享 UI 呢?

还是上面的图,在dashboard 目录下,创建一个layout.tsx的文件

那么这个layout.tsx文件就是dashboard下面的路由,都可以共享的UI

比如在 layout.tsx 文件中,代码如下:

export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <section>
      <p>这是共享的UI</p>

      {children}
    </section>
  );
}

我们分别访问下面的两个路由:

  • http://localhost:3000/dashboard

二、Nextjs 最新版本的应用路由教程

  • http://localhost:3000/dashboard/setting

二、Nextjs 最新版本的应用路由教程

路由处理程序 router handler

我习惯把这个叫API,或者叫接口,nextjs 是可以很轻松的写一个接口的。

举个例子就知道了,比如我们想要写一个GET类型的接口

那么我们可以按照下面的步骤做:比如接口为 http://localhost:3000/api/chat

  1. app 目录下,创建一个api 目录

    注:必须叫 api

  2. api 目录下,再创建一个目录 chat

  3. chat 目录下,创建一个文件 route.ts

    *注:必须叫 route.ts 我学这块的时候,把route.ts 拼写成了 router.ts ,就是调不通,大家不要犯我的错 *

  4. route.ts 中的代码如下:

    import {NextApiRequest, NextApiResponse} from 'next';
    import {NextResponse} from "next/server";
    
    export const GET = async (request: NextApiRequest, context: any) => {
      const {params} = context;
    
      try {
        return NextResponse.json({
          status: 200,
          data:{
            site:'www.helloworld.net',
            author:'待兔'
          }
        });
    
      } catch (e: any) {
        return NextResponse.json({status: 500, message: e.message});
      }
    }

    因为是个get接口,所以浏览器直接访问http://localhost:3000/api/chat

二、Nextjs 最新版本的应用路由教程

同里,你也可以在api下面创建任何目录 ,只需要在目录的下面创建一个route.ts文件,就可以了。

route.ts文件中,可以使用NextApiRequest, NextApiResponse 就可以完成网络请求和响应了。

好了,此节路由相关的知识就先介绍到这里,只介绍了最常用的路由配置

先会用最常用 的,后面不太懂的,可以自己查文档。

持续分享nextjs 最新版教程,希望多多支持,关注并转发一下。谢谢。

点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
nextjs教程三:获取数据
数据的获取数据获取是任何应用程序中最重要的部分,本文将介绍,如何在react,nextjs中获取数据主要有种方法可以获取数据在服务端,用fetch获取数据在客户端,通过路由处理器获取数据下面分别介绍一下这4种获取数据的方式一、fetch获取数据nextjs
Easter79 Easter79
3年前
springcloud zuul 网关 持久化 动态加载路由的思路分析
在springcloud最新的版本已经有了自己的gateway组件   目前世面上都是基于netflix出品 zuul的gateway    一般我们在生产上都希望能将路由动态化持久化 做动态管理基本设想思路 通过后台页面来管理路由  然后刷新配置  本文将探索一下如何进行zuul路由的数据库持久化 动态化 建议
Karen110 Karen110
4年前
手把手教你在Windows下设置分布式队列Celery的心跳轮询
/1前言/大家好,我是吴老板。用Celery官方的话来说,Celery是一个非常优秀的分布式队列,可应用于分布式共享中间队列和定时任务等等。/2 版本的差异/    Celery有很多个版本,各版本之间的差异可谓不小,比如最新的Celery6.0版本在稳定性远不如Celery4.0,所以在使用不同版本的时候,系统给到我们的反馈可能并不
Wesley13 Wesley13
3年前
QQ玩一玩好友排行榜与世界排行榜
QQ玩一玩好友排行榜与世界排行榜1、开发环境CocosCreatorV2.0.5手Q版本V7.9.0.3820(目前市场中最新版本)qqPlayCore.jsbuildTime:'FriNov09201813:20:45GMT0800(GMT08:00)'上出现,
Stella981 Stella981
3年前
Apache+Tomcat集群配置+session共享
 本文ApacheTomcat集群配置基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置。准备环境ApacheApache是http服务器,我们利用其对Tomcat进行负载均衡。目前最新版本为2.2.17,下载地址为http://httpd.apache.or
Stella981 Stella981
3年前
BeetlSQL 3.2.3 发布,Java 数据库访问工具
日常的版本更新,包含如下内容solon集成使用最新版本1.2.12新增DebugInterceptor的子类SimpleDebugInterceptor,简化SQL日志输出SpringBoot集成新增参数beetlsql.xxx1.sqlFileCharset,用于自定Markdown文件字符集<depende
待兔 待兔
1年前
一、nextjs 服务端渲染及环境搭建
一、nextjs服务端渲染及环境搭建从今天开始,我们会出一系列的nextjs文章,助力您快速掌握这一前端框架的精髓。我们知道,nextjs是基于react的服务端渲染的框架。所以必须要会react当然基于vue的服务端渲染框架,也有,叫nuxt,现在已经出
天航星 天航星
1年前
Java 比较版本号
在开发中,有时候会遇到比较两个文件的版本号,或者比较多个文件的版本号得出最新版本号。可以用如下代码解决:java/比较版本号@paramversion1版本号1@paramversion2版本号2@return0:版本号1版本号21:版本号1版本号21:版
融云IM即时通讯 融云IM即时通讯
10个月前
融云IM干货丨如何测试升级后的IMKit版本是否稳定?
测试升级后的IMKit版本是否稳定,可以遵循以下步骤和建议:确保使用最新版本的SDK:始终使用融云提供的最新的SDK版本,以确保所有已知的兼容性问题都已经被修复。测试不同操作系统版本:如果可能,测试应用在不同版本的操作系统上的表现,特别是最新版本的操作系统