next.js 中的高级数据获取
next.js 提供了用于在应用程序中获取数据的强大功能,包括服务器端渲染 (ssr)、静态站点生成 (ssg) 和客户端数据获取。通过利用这些技术,您可以构建高性能且可扩展的应用程序,从而提供无缝的用户体验。本指南将探索 next.js 中的高级数据获取技术,并演示如何在您的项目中实现它们。
服务器端渲染 (ssr)
示例:使用 getserversideprops
// pages/post/[id].js
export async function getserversideprops(context) {
const { params } = context;
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post,
},
};
}
const postpage = ({ post }) => {
return (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
);
};
export default postpage;
静态站点生成 (ssg)
next.js 中的静态站点生成允许您在构建时预渲染页面,确保内容是静态的并且可以直接从 cdn 提供服务。这可以显着提高性能并减少服务器的负载。
示例:使用 getstaticprops
// pages/index.js
export async function getstaticprops() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: {
posts,
},
};
}
const homepage = ({ posts }) => {
return (
<div>
{posts.map((post) => (
<div key="{post.id}">
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
))}
</div>
);
};
export default homepage;
增量静态再生 (isr)
next.js 中的增量静态重新生成允许您更新静态内容,而无需重建整个站点。这对于需要经常更新的页面非常有用,例如新闻文章或博客文章。
示例:将 getstaticprops 与 revalidate 结合使用
// pages/posts/[id].js
export async function getstaticprops(context) {
const { params } = context;
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post,
},
revalidate: 60, // revalidate the page every 60 seconds
};
}
const postpage = ({ post }) => {
return (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
);
};
export default postpage;
客户端数据获取
next.js 还支持客户端数据获取,允许您在初始页面加载后获取数据。这对于获取初始渲染不需要的数据或处理需要数据加载的用户交互非常有用。
示例:使用 useeffect 和 usestate 进行客户端数据获取
import { useeffect, usestate } from 'react';
const postspage = () => {
const [posts, setposts] = usestate([]);
const [loading, setloading] = usestate(true);
useeffect(() => {
const fetchposts = async () => {
const res = await fetch('https://api.example.com/posts');
const data = await res.json();
setposts(data);
setloading(false);
};
fetchposts();
}, []);
if (loading) {
return <p>loading...</p>;
}
return (
<div>
{posts.map((post) => (
<div key="{post.id}">
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
))}
</div>
);
};
export default postspage;
组合数据获取方法
在许多应用程序中,您可能需要结合不同的数据获取方法来优化性能和用户体验。例如,您可以使用 ssr 或 ssg 进行初始页面加载,并使用客户端获取其他数据或用户交互。
示例:结合 ssr 和客户端获取
// pages/user/[id].js
import { useeffect, usestate } from 'react';
export async function getserversideprops(context) {
const { params } = context;
const res = await fetch(`https://api.example.com/users/${params.id}`);
const user = await res.json();
return {
props: {
user,
},
};
}
const userpage = ({ user }) => {
const [posts, setposts] = usestate([]);
const [loading, setloading] = usestate(true);
useeffect(() => {
const fetchposts = async () => {
const res = await fetch(`https://api.example.com/users/${user.id}/posts`);
const data = await res.json();
setposts(data);
setloading(false);
};
fetchposts();
}, [user.id]);
return (
<div>
<h1>{user.name}</h1>
<p>{user.email}</p>
<h2>posts</h2>
{loading ? (
<p>loading...</p>
) : (
<div>
{posts.map((post) => (
<div key="{post.id}">
<h3>{post.title}</h3>
<p>{post.body}</p>
</div>
))}
</div>
)}
</div>
);
};
export default userpage;
使用 swr 进行客户端获取
swr(stale-while-revalidate)是 vercel 创建的一个用于数据获取的 react hook 库。它提供了缓存、重新验证、焦点跟踪等功能,使客户端数据获取更加高效和强大。
示例:使用 swr
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then((res) => res.json());
const SWRPostsPage = () => {
const { data, error } = useSWR('https://api.example.com/posts', fetcher);
if (error) return <p>Error loading posts.</p>;
if (!data) return <p>Loading...</p>;
return (
<div>
{data.map((post) => (
<div key="{post.id}">
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
))}
</div>
);
};
export default SWRPostsPage;
结论
next.js 提供了多种数据获取技术来满足不同的用例和性能要求。通过了解和利用 ssr、ssg、isr 和客户端数据获取,您可以构建功能强大、高性能的 web 应用程序,从而提供出色的用户体验。有效地结合这些技术可以帮助您优化 next.js 应用程序的速度和 seo,确保您的用户获得最佳体验。