看了好几天的 Next.js 介绍,是不是想要开始做个小专案,试试 Next.js 呢?我今天做了小小 project 使用 Next.js 的各种 data fetching functions (可以看这篇) 来串 Github API!不过今天不会详细跟大家分享怎麽实作,明天再继续~
用 Next.js 的 create-next-app
,在终端机输入以下指令建立专案:
npx create-next-app
# or
yarn create next-app
在首页用 Next.js 的 Link (next/link
) 加了两个连结,一个是回到 Home,另外一个是导去一个叫做 Next 的页面。像这篇提到的,用 Link 换页是 client-side 的 routing,所以浏览器不会看到白画面喔~
在首页也加了两个 input
,个别是 Github 的 username
和 repository
name。填了 username
之後,旁边的 Go 按钮会亮起来 (代表可以点下去了!),一点下去我们会被导去 User 页面。下面的 input
是给 repository
用的,如果想看某个 repo
,需要 username
和 repository
两个都填完,旁边的按钮才能点,帮我们导页去 Repo 页面。
左边是 Repo 页,右边是 User 页
Next 页面是采用 Static Generation 产生出来的,也就是使用 getStaticProps
去抓取该页所需的内容。透过 props
去传递 data
:
export async function getStaticProps() {
const res = await fetch("https://api.github.com/repos/vercel/next.js");
const data = await res.json();
return {
props: { data },
};
}
User 页的路径是 /users/[user]
,user
为动态资讯,也就是使用 dynamic routes 的方法!今天我用的是 getStaticProps
和 getStaticPaths
,而且还加了 revalidate
,让页面会不断更新,所以这页是采用 Incremental Static Regeneration 的模式:
export async function getStaticProps(context) {
const res = await fetch(
`https://api.github.com/users/${context.params.user}`
);
const data = await res.json();
return {
props: { data },
revalidate: 24 * 60 * 60, // 24 hours
};
}
export async function getStaticPaths() {
const res = await fetch("https://api.github.com/users");
const data = await res.json();
const paths = data.slice(0, 1000).map((u) => ({ params: { user: u.login } }));
return { paths, fallback: "blocking" };
}
Repo 页的路径是 /repos/[user]/[repo]
,user
和 repo
为动态资讯,一样是用 dynamic routes,不过这页是采用 getServerSideProps
实做出来的,也就是 Server-side Rendering:
export async function getServerSideProps(context) {
const res = await fetch(
`https://api.github.com/repos/${context.params.user}/${context.params.repo}`
);
const data = await res.json();
return {
props: { data },
};
}
今天这个小专案应该有用到前几天学的东东,大家觉得如何呢?有没有什麽问题?欢迎发问喔~
祝大家明天上班上课愉快!
晚安 <3
<<: Chapter3 今天来学习画一棵树(I)学学人家DOM 自己用递回做一个树状图结构
在页面中串接验证 API 在前一篇文章中,我们建立了一个 JWT JSON server,用来练习如...
DAY25 MongoDB 自订角色与使用者 前言 MongoDB 内的登入需要输入 使用者(use...
tags: 铁人赛 AWS Outposts EKS Kubernetes 简述 EKS 说明 Am...
继上次我说要先第一个用狗勾页面我就只先设置了那页的按钮,记得当你要对按钮下指令如asp-contro...
人们经常会被资料抽象和封装混淆,把抽象的概念当作封装或信息隐藏。事实并非如此。以下定义来自 ISO/...