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

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2