Next.js 入门笔记

news2024/11/18 9:22:27

前言

之前初步体验了 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 BaseModel

app = 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>
          <button
            onClick={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.coloradmin.cn/o/1062949.html

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

相关文章

Qt之显示PDF文件

之前使用过mupdf库&#xff0c;能够成功显示pdf&#xff0c;但是我用着有BUG&#xff0c;不太理解它的代码&#xff0c;搞了好久都不行。后面又试了其他库&#xff0c;如pdfium、popler、下载了很多例程&#xff0c;都跑不起来&#xff01;后面偶然得知xpdf库&#xff0c;看起来…

【C++设计模式之建造者模式:创建型】分析及示例

简介 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 描述 建造者模式通过将一个复杂对象的构建过程拆分成多个简单的部分&#xff0c;并由不同…

华为云云耀云服务器L实例评测|部署个人音乐流媒体服务器 navidrome

华为云云耀云服务器L实例评测&#xff5c;部署个人音乐流媒体服务器 navidrome 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 产品优势1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 navidrome3.1 navidrome 介绍3.…

全志ARM926 Melis2.0系统的开发指引⑦

全志ARM926 Melis2.0系统的开发指引⑦ 编写目的11. 调屏11.1. 调屏步骤简介11.1.1. 判断屏接口。11.1.2. 确定硬件连接。11.1.3. 配置显示部分 sys_config.fex11.1.3.1. 配置屏相关 IO 11.1.4. Lcd_panel_cfg.c 初始化文件中配置屏参数11.1.4.1. LCD_cfg_panel_info11.1.4.2. L…

网课搜题 小猿题库多接口微信小程序源码 自带流量主

多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_…

【C语言经典100例题-70】求一个字符串的长度(指针)

代码 使用指针来遍历字符串&#xff0c;直到遇到字符串结尾的空字符\0为止&#xff0c;统计字符数量即为字符串长度。 #include<stdio.h> #define n 20 int getlength(char *a) {int len 0;while(*a!\0){len;a;}return len; } int main() {char *arr[n] { 0 };int l…

软技能继续挑战网络安全领域

根据 ISACA 的一份新报告&#xff0c;新的网络安全调查结果指出了网络安全专家缺乏的领域&#xff0c;其中人际技能、云计算和安全措施是网络安全专家最突出的技能缺陷。 59% 的网络安全领导者表示他们的团队人手不足。50% 的受访者表示有非入门级职位的职位空缺&#xff0c;而…

多媒体应用设计师

1.多媒体技术基础 1.1.媒体与技术 1.1.媒体 维基百科&#xff1a;传播信息载体 国际电信联盟&#xff08;ITU-T&#xff09;&#xff1a;感知、表示、存储和传输的手段和方法。 两层含义&#xff1a;存储信息的实体&#xff0c;媒质。传递信息载体&#xff0c;媒介。 1.2.国…

使用Python优雅的绘制甘特图

简介 Gantt图表是一种条形图&#xff0c;用于描绘项目进度。图表在垂直轴上列出要执行的任务&#xff0c;在水平轴上列出时间间隔。图中水平条的宽度显示每个活动的持续时间。在Python中&#xff0c;我们可以使用Plotly库来创建和展示Gantt图表。 基础的Gantt图表 首先&…

beego-简单项目写法--路径已经放进去了

Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样&#xff0c;所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…

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

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

[NISACTF 2022]join-us - 报错注入无列名注入

点击登录&#xff0c;找到注入点 这种框&#xff0c;可以直接爆破关键字&#xff0c;看是否拦截&#xff0c;也可以手动尝试&#xff0c;发现、union、and、or、substr、database等关键字都拦截了 1、学到了&#xff1a;可以用数据库中不存在的表名或者不存在的自定义函数名爆…

面试高频手撕算法 - 01背包系列

1. 前言 为什么要专门去搞一下这个背包问题呢 ? 因为作者已经在两场面试中吃了这个亏, 尤其是在面深信服的测开岗的时候, 一面的难度适中, 加上面试官也没为难我, 侥幸让我过了. (以下是一面问题) 二面的时候, 主要问了项目和手撕算法. 当时项目个人觉得面的还不错, 因为本人是…

Mac下docker安装MySQL8.0.34

学习并记录一下如何用docker部署MySQL 在Docker中搜索并下载MySQL8.0.x的最新版本 下载好后&#xff0c;在Images中就可以看到MySQL的镜像了 通过下面的命令也可以查看docker images启动镜像&#xff0c;使用下面的命令就可以启动镜像了docker run -itd --name mysql8.0.34 -…

java项目log4j2单独为某个类配置日志文件

在项目中&#xff0c;一般都是把日志记录到一个日志文件中。 对应的log4j2.xml内容如下图所示&#xff1a;只有一个RollingFile节点&#xff0c;整个系统只会生成一个log日志文件。 生成的日志文件如下图&#xff1a; 当系统不断扩大&#xff0c;业务越来越复杂&#xff0c;所…

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…

阶段五-Day02-jQuery

一、jQuery入门 1. 定义和特点 目前最流行的JavaScript函数库之一&#xff0c;对JavaScript进行了封装。 并不是一门新语言&#xff0c;而是将常用的、复杂的JavaScript操作进行函数化封装&#xff0c;封装后可以直接调用&#xff0c;大大降低了使用JavaScript的难度&#xf…

Dism软件安装指南:优化Windows系统的必备利器

主旨 有没有发现&#xff0c;自己的电脑时间一长&#xff0c;是不是就会变得越来越慢&#xff0c;越来越卡&#xff0c;当你去网上查资料的时候&#xff0c;都是说什么磁盘碎片清理&#xff0c;禁止程序自启动什么的&#xff0c;不是说这些方式没用&#xff0c;反而很有用&…

四、【选区】

文章目录 为什么使用选区&#xff1f;选区的用途&#xff1a;抠图、修图、调色、合成等怎么对选区进行操作&#xff1f;1.如何建立选区并对选区进行建立?2.加选和减选与交叉选区&#xff1f;3.选区前先调整羽化值: 为什么使用选区&#xff1f; 是我们在一个图片里面选中一个区…

基于Java的培训学校课程资源网站设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…