Next.js 入门笔记

前言

之前初步体验了 React 的魅力, 又看文档理解了一下 useStateuseEffect, 目前初步理解的概念是:
useState 用来声明在组件中使用并且需要修改的变量
useEffect 用来对 useState 声明的变量进行初始化赋值

可能理解的不太准确, 不过大概差不多是这么个意思. 但是再往后看路由什么的就头大了, 还得手动添加各种其他的 package 进行实现, 显然不符合 OOBE 的体验. 逛了一圈发现基于 React 做的另外一个更 “高级” 的框架 Next.js, 来个快速入门做一下笔记.

后端实现

计划使用 FastAPI 进行后端的设计, Next.js 做前端. Python, nodejs, VScode 什么的安装环境就不罗嗦了, 直接开干!

# 创建项目文件夹
New-Item -ItemType Directory .\next-study; New-Item -ItemType Directory .\next-study\backend; cd next-study\backend# 初始化后端 FastAPI 文件夹
virtualenv venv
code .

在 VScode 中打开 Terminal (会自动激活当前的 Virtualenv), 安装依赖:

pip install fastapi uvicorn

创建 main.py

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModelapp = FastAPI()# 配置 CORS 跨域允许访问
app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_methods=['*']
)# 定义要处理的请求中的 JSON 数据格式
class Message(BaseModel):message: str@app.get('/')
def get_data():# GET 数据的路由return {'message': 'This is default message from FastAPI'}@app.put('/')
def update_data(update_message: Message):# PUT 更新数据的路由# 直接在函数定义里面加入参数就能接收和处理请求发来的 JSON 数据了, FastAPI 果然是干这个的, 好用!return update_message

回到 Terminal 启动:

uvicorn main:app --reload

用 Apipost 测一下, 真 tm 好使~
在这里插入图片描述
OK, 后端就先这样

前端实现

最小化后端的 VScode, 回到 PowerShell 中使用脚手架创建 Next.js 项目

# 返回 next-study 路径
cd ...
# 脚手架走起来
npx create-next-app frontend
# 全用默认回复, 完成项目创建
√ Would you like to use TypeScript? ... No / Yes
√ Would you like to use ESLint? ... No / Yes
√ Would you like to use Tailwind CSS? ... No / Yes
√ Would you like to use `src/` directory? ... No / Yes
√ Would you like to use App Router? (recommended) ... No / Yes
√ Would you like to customize the default import alias (@/*)? ... No / Yes
# 开干
cd frontend
code .

先不整花里胡哨的, 直接清空 app/page.tsx 内容, 重新写一个简单的页面:

"use client"; // 声明这是一个 Client Side Render 的 Component
import { useEffect, useState } from "react";// 使用接口定义页面中用到的数据格式
interface Data {message: string;
}const page = () => {// 声明页面中要维护的数据及默认值const [data, setData] = useState<Data>({message: "Default message of Next useState()",});// Component 加载时自动从后端获取数据const apiUrl = "http://localhost:8000";useEffect(() => {fetch(apiUrl).then((res) => res.json()).then((json) => {setData(json);});}, []);  // 务必注意加上后面的第二个空数组参数, 否则页面会一直向后端发送请求获取数据return (<div><p>{data.message}</p></div>);
};export default page;

npm run dev 跑一下:
在这里插入图片描述
如果把 useEffect() 中的 setData() 注释掉, 则会显示 useState 定义的默认内容
在这里插入图片描述
接下来添加一个 Button 用来和后端交互更新页面内容

"use client"; // 声明这是一个 Client Side Render 的 Component. Next.js 默认使用 Server Side Render
import { useEffect, useState } from "react";// 使用接口定义页面中用到的数据格式
interface Data {message: string;
}const page = () => {// 声明页面中要维护的数据及默认值const [data, setData] = useState<Data>({message: "Default message of Next useState()",});// Component 加载时自动从后端获取数据const apiUrl = "http://localhost:8000";useEffect(() => {fetch(apiUrl).then((res) => res.json()).then((json) => {setData(json);});}, []); // 务必注意加上后面的第二个空数组参数, 否则页面会一直向后端发送请求获取数据// 按钮点击事件const handleClick = async () => {fetch(apiUrl, {method: "PUT",headers: {"Content-Type": "application/json",},body: JSON.stringify({message: "Updated message by Next.js button.",}),}).then((ret) => ret.json()).then((json) => setData(json)); // 调用 useState 返回的第二个函数进行数据更新};return (<div><p>{data.message}</p><button onClick={handleClick}>Click me</button></div>);
};export default page;

刷新点击按钮查看效果
在这里插入图片描述
Emm…好像也不是太复杂的 😉

美化一下

还记得开头用 Next.js 脚手架创建项目的时候问题里面包含了 Tailwind CSS 吧, 快速瞅一下文档, 美化一下页面样式

"use client"; // 声明这是一个 Client Side Render 的 Component. Next.js 默认使用 Server Side Render
import { useEffect, useState } from "react";// 使用接口定义页面中用到的数据格式
interface Data {message: string;
}const page = () => {// 声明页面中要维护的数据及默认值const [data, setData] = useState<Data>({message: "Default message of Next useState()",});// Component 加载时自动从后端获取数据const apiUrl = "http://localhost:8000";useEffect(() => {fetch(apiUrl).then((res) => res.json()).then((json) => {setData(json);});}, []); // 务必注意加上后面的第二个空数组参数, 否则页面会一直向后端发送请求获取数据// 按钮点击事件const handleClick = async () => {fetch(apiUrl, {method: "PUT",headers: {"Content-Type": "application/json",},body: JSON.stringify({message: "Updated message by Next.js button.",}),}).then((ret) => ret.json()).then((json) => setData(json));};return (<div>{/* Hero section */}<div className="bg-blue-900 text-white py-16"><div className="container mx-auto text-center"><h1 className="text-4xl font-bold">{data.message}</h1><p className="mt-4 text-lg">Click the button will change content from FastAPI.</p><buttononClick={handleClick}className="mt-8 bg-yellow-500 hover:bg-yellow-600 text-blue-900 font-semibold py-2 px-6 rounded-full inline-block transition duration-300 ease-in-out">Click me</button></div></div></div>);
};export default page;

美丽!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…

数字孪生、AR和VR如何改进数据中心设计

数据中心基础设施管理(DCIM)已存在多年&#xff0c;它在许多数据中心被广泛使用&#xff0c;但还没有普遍使用&#xff0c;由于两个因素&#xff0c;这种情况正在改变&#xff1a;数字化的概念正在普及&#xff0c;IT与运营技术(OT)系统(如建筑管理系统(BMS)和电源管理工具)的集…

从零开始的C++(五)

1.类和对象的补充 当对象是const修饰的常量时&#xff0c;形参中的this是隐含的&#xff0c;那么该如何写函数才能传常量对象呢&#xff1f;如果还是按照正常的方式写&#xff0c;则会出现实参是const修饰的&#xff0c;形参没有&#xff0c;出现了权限的扩大&#xff0c;无法…

Django 模型层的操作(Django-05 )

一 模型层的解读 Django中内嵌了ORM框架&#xff0c;不需要直接编写SQL语句进行数据库操作&#xff0c;而是通过定义模型类&#xff0c;操作模型类来完成对数据库中表的增删改查和创建等操作。 O 是object&#xff0c;也就类对象的意思。R 是relation&#xff0c;翻译成中文是…

快手直播显示请求过快

快手直播显示请求过快 问题描述情况一问题描述原因分析解决方案:情况二问题描述解决方法问题描述 在使用快手直播网页版时,如果我们的请求过于频繁,系统可能无法及时显示所需内容。这种情况下,我们会收到一个稍后重试的提示。一般有两种情况。一种是直接返回一段json,里面…

图像和视频上传平台Share Me

本文完成于 6 月&#xff0c;所以反代中&#xff0c;域名演示还是使用的 laosu.ml&#xff0c;不过版本并没有什么变化&#xff1b; 什么是 Share Me &#xff1f; Share Me 是使用 Next.js 和 PocketBase 的自托管图像和视频上传平台&#xff0c;具有丰富的嵌入支持和 API&…

【Qt基础篇】信号和槽

文章目录 一些常见的bug&#xff1a;字符集不对产生的错误VS平台中文乱码 QT的优点关于.pro文件QtCreator快捷键最简单的qt程序按钮的创建对象模型**Qt窗口坐标**体系信号和槽机制connect函数系统自带的信号和槽案例&#xff1a;实现点击按钮-关闭窗口的案例 自定义信号和槽案例…

【网络】路由器和交换机的区别

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

好奇喵 | Tor浏览器——访问.onion网址,揭开Dark Web的神秘面纱

前言 在之前的博客中&#xff1a; 1.Surface Web —&#xff1e; Deep Web —&#xff1e; Dark Web&#xff0c;我们解释了表层网络、深层网络等的相关概念&#xff1b; 2.Tor浏览器——层层剥开洋葱&#xff0c;我们阐述了Tor的历史和基本工作原理&#xff1b; 3.Tor浏览器…

C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Complete VEGAS Code /// adaptive/recursive Monte Carlo /// </summary> public abstract class VEGAS { const int NDMX 50; const int …

Linux CentOS7 vim寄存器

计算机中通常所说的寄存器Register一般指的是CPU中的寄存器&#xff0c;用来暂存CPU处理所需要的指令、数据等。 vim中同样也有寄存器&#xff0c;使用的方式和CPU非常类似。 vim中的寄存器(register)作用和windows中的剪切板类似&#xff0c;不过vim中的寄存器不止一个&…

解决WPF+Avalonia在openKylin系统下默认字体问题

一、openKylin简介 openKylin&#xff08;开放麒麟&#xff09; 社区是在开源、自愿、平等和协作的基础上&#xff0c;由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区&#xff0c;致力于通过开源、开放的社区合作&#xff…

IEEE802系列协议知识点总结

IEEE 802 协议包含了以下多种子协议。把这些协议汇集在一起就叫IEEE 802 协议集。 (1)IEEE802.1 IEEE 802.1协议提供高层标准的框架&#xff0c;包括端到端协议、网络互连、网络管理、路由选择、桥接和性能测量。 •IEEE 802.1d:生成树协议(Spanning Tree Protocol&#xff0c…

计算机专业毕业设计项目推荐12-志愿者管理系统(Spring+Js+Mysql)

志愿者管理系统&#xff08;SpringJsMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的过程…

QT:鼠标画线(双画布)

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPoint> //点 #include <QMouseEvent> //鼠标事件 #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Wi…

汽车网络安全--安全芯片应用场景解析

​在聊汽车网络安全时,最先想到的就是使用芯片内置HSM,比如说英飞凌TC2xx系列的HSM、瑞萨RH850的ICU、NXP的HSE等等;实际上除了内置HSM,还有外置HSM(通过UART、SPI等通信)、安全存储芯片等等。而这些芯片统称为安全芯片。 安全芯片的主要作用是为整个系统建立起一个可信的…

IIS Application Pool

在连接字符串Connection string中&#xff0c;Pooling为是否启用连接池&#xff0c;默认值为Poolingtrue&#xff0c;表示启用。与连接池相关的两个重要参数是 Min Pool Size(默认值是0) 和 Max Pool Size (默認值為100&#xff0c;最大值为32767)&#xff0c;分别指池中的最小…

通过融合UGV的地图信息和IMU的惯性测量数据,实现对车辆精确位置和运动状态的估计和跟踪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

543. 二叉树的直径

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,…

ChatGPT基础使用总结

文章目录 一、ChatGPT基础概念大型语言模型LLMs---一种能够以类似人类语言的方式“说话”的软件ChatGPT定义---OpenAI 研发的一款聊天机器人程序&#xff08;2022年GPT-3.5&#xff0c;属于大型语言模型&#xff09;ChatGPT4.0---OpenAI推出了GPT系列的最新模型ChatGPT典型使用…