getStaticProps
是 Next.js 框架中的一个功能,用于在构建时生成静态页面。它允许你在组件外部获取数据,并将这些数据作为 props 传递给组件。这种方式非常适合内容不经常变化的页面,因为它可以提高应用的性能和 SEO。
getStaticProps
主要用于获取数据并将其传递给页面组件。假设我们有一个博客应用,需要在 pages/posts/[id].js
中显示单篇博客的内容。
/pages
/posts
[id].js
import React from 'react';
const Post = ({ post }) => {
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
};
export async function getStaticPaths() {
// 获取所有博客的 ID
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
// 生成静态路径
const paths = posts.map((post) => ({
params: { id: post.id.toString() },
}));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
// 获取特定博客的内容
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post,
},
};
}
export default Post;
getStaticProps
中的数据没有更新?原因:getStaticProps
在构建时运行一次,生成静态页面。如果数据在构建后发生了变化,页面不会自动更新。
解决方法:
getStaticProps
的 revalidate
选项,允许页面在一定时间后重新生成。export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data,
},
revalidate: 10, // 每 10 秒重新生成一次
};
}
fallback: true
:对于不经常变化的页面,可以使用动态路由和 fallback: true
选项,在首次访问时生成页面,并缓存结果。export async function getStaticPaths() {
return { paths: [], fallback: true };
}
export async function getStaticProps({ params }) {
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post,
},
revalidate: 60, // 每 60 秒重新生成一次
};
}
通过这些方法,可以确保即使数据发生变化,页面也能及时更新。