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目录下的。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

paddleocr C++生成dll

目录 编译完成后修改内容: 新建ppocr.h头文件 注释掉main.cpp内全部内容&#xff0c;将下面内容替换进去。ppocr.h需要再环境配置中包含进去头文件 然后更改配置信息&#xff0c;将exe换成dll 随后右击重新编译会在根目录生成dll,lib文件。 注意这些dll一个也不能少。生成…

伪装目标检测论文阅读 SAM大模型之参数微调:Conv LoRA

paper&#xff1a;link code&#xff1a;还没公开 摘要 任意分割模型(SAM)是图像分割的基本框架。虽然它在典型场景中表现出显著的零镜头泛化&#xff0c;但当应用于医学图像和遥感等专门领域时&#xff0c;其优势就会减弱。针对这一局限性&#xff0c;本文提出了一种简单有效…

Java进阶-JavaStreamAPI的使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例&#xff0c;文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

Django之搭配内网穿透

一&#xff0c;安装coplar 二&#xff0c;开启8087的内网穿透 三&#xff0c;setting.py中加入如下配置&#xff1a; ALLOWED_HOSTS [*]CSRF_TRUSTED_ORIGINS ["https://localhost:8087", "http://localhost:8087"]四&#xff0c;启动项目 五&#xff…

比较美观即将跳转html源码

源码介绍 比较美观即将跳转html源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码截图 比较美观的一个跳转界面&#xff0c;修改方法如上&…

MATLAB实现果蝇算法优化BP神经网络预测分类(FOA-BP)

果蝇算法&#xff08;Fruit Fly Optimization Algorithm, FFOA&#xff09;是一种启发式优化算法&#xff0c;受果蝇觅食行为的启发。将其应用于优化BP神经网络&#xff0c;主要是为了寻找BP神经网络中的最佳权重和偏置值。以下是一个基本的流程&#xff1a; 初始化&#xff1a…

Ubuntu20.04 [Ros Noetic]版本——在catkin_make编译时出现报错的解决方案

今天在新的笔记本电脑上进行catkin_make的编译过程中遇到了报错&#xff0c;这个报错在之前也遇到过&#xff0c;但是&#xff0c;我却忘了怎么解决。很是头痛&#xff01; 经过多篇博客的查询&#xff0c;特此解决了这个编译报错的问题&#xff0c;于此特地记录&#xff01;&…

【bug已解决】发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动......

本bug报错已找到原因,并成功解决。 项目场景: vmware安装ubuntu报错。 如下: 发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动。错误配置虚拟机、客户机操作系统中的错误或 VMware Workstation 中的问题都可以导致关闭状…

kaggle(4) Regression with an Abalone Dataset 鲍鱼数据集的回归

kaggle&#xff08;4&#xff09; Regression with an Abalone Dataset 鲍鱼数据集的回归 import pandas as pd import numpy as npimport xgboost import lightgbm import optuna import catboostfrom sklearn.model_selection import train_test_split from sklearn.metrics …

C++之list模拟实现

1、定义 定义一个结点&#xff1a; 在list类中的定义&#xff1a; 2、push_back() 3、迭代器 3.1迭代器的构造和定义 3.2、迭代器中的取值 3.3、迭代器的迭代(前置或前置--) 3.4、迭代器的迭代(后置或后置--) 3.5、迭代器的判断 3.6、在类list的定义 4.begin()和end() 5.con…

Nodejs 第六十九章(杀毒)

杀毒 杀毒&#xff08;Antivirus&#xff09;是指一类计算机安全软件&#xff0c;旨在检测、阻止和清除计算机系统中的恶意软件&#xff0c;如病毒、蠕虫、木马、间谍软件和广告软件等。这些恶意软件可能会对计算机系统和用户数据造成损害&#xff0c;包括数据丢失、系统崩溃、…

⑥ - 后端工程师通识指南

&#x1f4d6; 该文隶属 程序员&#xff1a;职场关键角色通识宝典 ✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏…

windows下git提交修改文件名大小写提交无效问题

windows系统不区分大小写&#xff0c;以及git提交忽略大小写&#xff0c;git仓库已存在文件A.js&#xff0c;本地修改a.js一般是没有提交记录的&#xff0c;需要手动copy一份出来A.js&#xff0c;再删除A.js文件提交仓库删除后&#xff0c;再提交修改后的a.js文件。 windows决…

岚图汽车与东软睿驰签署战略合作协议

4月26日,东软睿驰与岚图汽车正式签署战略合作协议,双方将结合在各自领域拥有的产业资源、技术研发和资本运作等优势,聚焦智能化产品和应用,建立长期共赢的战略合作伙伴关系,通过不断探索未来新技术、新产业、新业态和新模式,围绕用户需求共同打造极致的智能出行体验。 图为岚图…

【AIGC调研系列】llama3微调具体案例

Llama3的微调可以通过多种方式进行&#xff0c;具体案例包括&#xff1a; 使用XTuner进行微调&#xff0c;尝试让Llama3具有"它是SmartFlowAI打造的人工智能助手"的自我认知。这涉及到准备自我认知训练数据集&#xff0c;并通过脚本生成数据[2][8]。利用Unsloth和Go…

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

求解素数环问题

注&#xff1a;这里我的代码是以第一位为最大数n为首元素不动的 思路&#xff1a; 首先我们分析问题要以较小规模的样例进行分析&#xff0c;例如n3时 第一步&#xff1a;深入搜索 我们先不管后面怎么样&#xff0c;当前的首要目标是先确定第一个元素的值&#xff0c;可知有…

paddlehub的简单应用

1、下载安装 pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple 报错&#xff1a; Collecting onnx<1.9.0 (from paddle2onnx>0.5.1->paddlehub)Using cached https://pypi.tuna.tsinghua.edu.cn/packages/73/e9/5b953497c0e36df589fc60cc6c6b35…

Java中集合概述(补充ing)

一、集合分类 Java中的集合框架提供了多种类型的集合&#xff0c;主要分为两大类&#xff1a;单列集合&#xff08;只保存单一类型的对象&#xff09;和双列集合&#xff08;保存具有键值对关系的对象&#xff09;。下面对这些集合进行分类介绍&#xff0c;但由于源码分析会涉…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…
最新文章