next.js v14 从入门到跑路

2024-04-29 07:52
文章标签 入门 js next v14

本文主要是介绍next.js v14 从入门到跑路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用next.js也有几天了,也是这么一个边看边用这么一个状态,现在主要使用app router模式,更新下next.js v14 app router模式方面的姿势吧。

区别于前面的pages router, app router虽然也是根据目录结构来划分路由,但是它不再依赖于使用getServerSideProps/getStaticProps在服务器时期去获取数据,在app router模式下只区分服务器组件和客户端组件,且一些在pages路由模式下的方法也无法在app路由下使用。

那现在服务器组件怎么获取数据呢?

nextjs app router现在约定的结构是:

app 目录名 (即路由名,比如名字是home,对用的路径是/home)page.ts 当前页面对应的路由layout.ts layout布局组件loading.ts loading加载动画not-found.ts 404页面api restful api文件夹

每一个目录下至少需要一个page.ts文件,否则访问该路由会报错。而layout布局文件则根据是否需要来创建;loading加载文件相当于suspense里的loading,也就是加载这个路由前的加载动画(Suspense应该是唯一一个能用的react组件了吧在服务器组件里,且suspense不需要指定loaidng了);not-found 404页面,只有app根目录下才需要,其他子路由创建无效;api文件夹是存放restful api文件的地址,同app router,一个文件就是一个路由,且同app router的page.ts,restful只认route.ts文件为当前路由文件。

next.js只区分服务器组件和客户端组件,服务器组件可以是异步的。所以如果我们需要在服务器组件里获取数据,直接await请求就可以了。真的比pages路由里的export function getServerSideProps啥的不要方便太多。比如:

import React from 'react';export default async function Home() {const { data } = await fetch(xxx);...return (<div>...<Child result={data} />...</div>)
}

我们把请求好的数据当成props传给子组件就行了,逻辑是与pages的getServerSideProps是一样的;
但是一定要小心,千万不要在服务器组件里使用任何react的hooks或其他api,连组件的合成事件都不行!

这里补充下RESTFUL api的使用方法!

目录结构:

tips: api文件是在app目录下的。

apilogin route.ts // 访问地址是(/api/login)getGamelist route.ts // 访问地址是(/api/getGamelist)...

前面说了只有当前目录下的route.ts才会被当成路由文件,一个route.ts里可以定义GET/POST/PUT/DELETE等method名称的函数,即每个函数对应请求该接口的method属性的接口,所以可以根据需求来设计对应的方法。
route.ts文件

import { NextResponse, NextRequest } from 'next/server';export function Post(req: NextRequest ) {...return NextResponse.json({...}, {status: 200})
}

补充2:
怎么获取Post请求携带的参数?
NextRequest 这个类型是在Web Request api的基础上继承来的(NextResponse也是同理),在Request基础上拓展更多更好使用的属性或方法,具体可看文档。所以想要获取post请求里的req.body 我们可以看mdn上Request的说明 ,其描述携带参数后body是ReadableStream类型,那我们获取直接json格式化就可以了,注意这是一个异步操作。
例如login下的route.ts是这样的:

import { NextResponse, NextRequest } from 'next/server';export async function Post(req: NextRequest ) {const { token } = (await request.json()) as { token?: string };...return NextResponse.json({...}, {status: 200})
}

这样我们就能拿到body里传过来的token字段了。
使用则直接fetch/xmlHttpRequest请求/api/login

...
const request = new Request('/api/login', {method: 'post',body: JSON.stringify({ token }),
})
fetch(request).then((res) => res.json()).then((res) => {...})

一些个人使用后的发现:

虽然区分服务器组件和客户端组件,但是客户端组件不是说一定在浏览器里动态给你渲染出来,它也是在服务器里给你渲染好的。真正想要在浏览器里渲染你可以使用动态导入并指明不需要ssr;

import dynamic from 'next/dynamic';const Loading = dynamic(() => import('@/components/loading'), { ssr: false });

这个Loading组件就不会在服务器时期渲染了。dynamic不止用来延迟加载组件,也可以延迟加载库。

动态路由怎么定义,同pages路由,凡是[xxx]的文件夹都是对应的动态路由。在app router下是不能使用next/router,因为它是只为pages路由服务的,next.js把路由相关的api封装到了next/navigation里。注意pages路由模式也不能使用next/navigation,这是为app router设计的。

那怎么获取路由参数呢?

import { useParams } from 'next/navigation' 通过useParams来获取当前的路由参数。
const params = useParams() 输出这个params就能看到当前所有的路由参数;
import { useSearchParams } from 'next/navigation' 来获取location.search参数
usePathname 则是获取当前的路由地址
编程式导航则给到了useRouter,这个api跟vue router常用用法基本一致,也是啥push/replace/back(vue是go)
以上几个api都来自next/navigation,需要注意的是这几个都是只能在客户端组件内调用,不能用在服务器组件里。
next/navigation里服务器组件能用的api:
notFound 打开404页面
redirect 重定向到某个页面

其他一些补充(server api):
fetch同样是拓展了Web fetch 方法,现在可以指定cache字段来设置缓存时间,所以fetch方法不需要额外导入。
next/headers暴露的headersapi可以让你获取请求头里的参数,只读。
next/headers暴露的cookies`则可以增删改查cookies。怎么用直接看MDN。

标题next.js内置的组件

Image

image组件是专门用来处理图像的,它功能是非常强大的。看文档
它支持懒加载图片,支持加载动画,可以是 <今天先这么多吧 ,来活了 我要去码>

这篇关于next.js v14 从入门到跑路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945510

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性