在Next.js中,动态路由可以通过使用文件系统作为路由的基础来模拟静态路由的外观和行为。以下是实现这一目标的基础概念和相关步骤:
/posts/[id]
。/about
或 /contact
。在 pages
目录下创建一个文件夹,例如 posts
,并在其中创建一个 [id].js
文件。这会告诉Next.js这是一个动态路由。
pages/
└── posts/
└── [id].js
在 [id].js
文件中编写你的组件逻辑。你可以使用 useRouter
钩子来获取路由参数。
// pages/posts/[id].js
import { useRouter } from 'next/router';
const Post = () => {
const router = useRouter();
const { id } = router.query;
return (
<div>
<h1>Post {id}</h1>
{/* 这里可以添加更多内容 */}
</div>
);
};
export default Post;
为了使动态路由看起来像静态路由,你可以使用增量静态再生(ISR)或静态站点生成(SSG)。
ISR允许你在构建时生成页面,并在后台按需更新它们。
// pages/posts/[id].js
import { useRouter } from 'next/router';
const Post = ({ post }) => {
const router = useRouter();
if (router.isFallback) {
return <div>Loading...</div>;
}
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
};
export async function getStaticPaths() {
// 获取所有可能的post id
const paths = await fetch('https://api.example.com/posts').then(res => res.json());
return {
paths,
fallback: true, // 允许ISR
};
}
export async function getStaticProps({ params }) {
const post = await fetch(`https://api.example.com/posts/${params.id}`).then(res => res.json());
return {
props: { post },
revalidate: 10, // 每10秒重新生成页面
};
}
export default Post;
SSG在构建时生成所有页面,适用于内容不经常变化的场景。
// pages/posts/[id].js
import { useRouter } from 'next/router';
const Post = ({ post }) => {
const router = useRouter();
if (router.isFallback) {
return <div>Loading...</div>;
}
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
};
export async function getStaticPaths() {
// 获取所有可能的post id
const paths = await fetch('https://api.example.com/posts').then(res => res.json());
return {
paths,
fallback: false, // 不允许ISR
};
}
export async function getStaticProps({ params }) {
const post = await fetch(`https://api.example.com/posts/${params.id}`).then(res => res.json());
return {
props: { post },
};
}
export default Post;
通过上述方法,你可以在Next.js中有效地使动态路由看起来像静态路由,从而提升应用的性能和用户体验。
领取专属 10元无门槛券
手把手带您无忧上云