接下来的13和14介绍了generateMetadata函数,作为设置所有页面元数据的推荐方法。
唯一的问题是,由于逻辑被分离,基于后端字段的数据需要进行 * 两次 * 调用,而不是一次。
考虑以下page.tsx
:
export default async function ProfilePage(props){
try{
const profile = await prisma.users.findUnique({
// ... fetch user data
});
return <div>Profile page</div>;
} catch(err){
notFound();
}
}
export async function generateMetadata(params){
const profile = await prisma.users.findUnique({
// ... fetch user data
});
return {
title: `${profile.name}'s Profile`,
};
}
字符串
这需要我获取相同的信息 * 两次 *。
我如何才能在不重复获取的情况下获得相同的结果呢?我想避免使用document.title
,因为这会导致在嵌套页面上执行时产生不和谐的体验。
1条答案
按热度按时间ddarikpa1#
这样做的唯一问题是--由于逻辑是分离的--基于来自后端的字段的数据需要进行两次调用,而不是一次。
解决方案:
将
await prisma.users.findUnique
写在一个cache() function
函数中,该函数被react提供的cache() function
Package 在该页面中并从该页面返回数据。然后只需调用该函数const profile = await Function()
。由于该函数被缓存并在同一页面上被调用两次,因此NextJS可以防止重复调用。我做的示例代码: 文件夹结构:*
字符串
说明:
/user
,它显示所有用户,当您单击任何用户时,它会将您带到该页面服务器端的详细信息页面/user/user_id
,我们生成元数据并通过调用API将用户数据设置为页面。用户页面
projectName\src\app\user\page.js
(此页面仅拨打电话并获取用户列表):型
用户详情页
projectName\src\app\user\[id]\page.js
:型
输出:
http://localhost:3000/user
,此页面的元数据标题设置为从API数据计算的用户数。它将用户显示为链接,单击以查看特定用户详细信息有API 2个调用,一个使用缓存,第二个不使用。http://localhost:3000/user/user_id
上,在终端中,你会看到缓存 Package 的API调用只执行一次,另一个在未注解时运行两次。*数据获取、缓存和恢复:https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating
*缓存在Next.js:https://nextjs.org/docs/app/building-your-application/caching
***缓存功能:**https:nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#example
***缓存数据:**https:nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data
*缓存:https://react.dev/reference/react/cache