我在使用Next.js 13实现动态标题时遇到了问题。
文档说,(https://beta.nextjs.org/docs/routing/pages-and-layouts#modifying-head)
警告:当前,导出不会使用next/link在客户端过渡中重新渲染,仅在初始渲染和重新加载时重新渲染。要解决此问题,您可以使用具有useEffect的客户端组件来更新document. title。我们计划在未来版本中修复此问题。
然后我尝试使用useEffect来实现动态标题,
'use client';
import { useEffect } from "react";;
import Head from 'next/head';
interface Props {
params: {slug : string},
searchParams: {id:string}
};
const getPost = async (id: string) => {
const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
const posts = await res.json();
return posts;
};
const Page = ({params, searchParams}: Props) => {
useEffect(() => {
const setDocumentTitle = async () => {
const post = await getPost(params.slug);
document.title = post.title;
}
setDocumentTitle();
}, [params.slug]);
return (<>
<Head>
<title>Blog Post</title>
</Head>
<div>
<h1>Blog Post</h1>
<p>Slug: {params.slug}</p>
<p>Id: {searchParams.id}</p>
</div>
</>);
};
export default Page;
字符串
但是它不起作用。标题仍然没有改变。有什么办法吗?
codesandbox前几次似乎运行良好,但如果您继续返回并单击Go to Post 1(next/link),文档标题不会更改。
2条答案
按热度按时间3xiyfsfu1#
对不起,我迟到了,我希望你现在已经弄明白了,但如果有人发现它有用,请查看这个:https://nextjs-discord-common-questions.joulev.dev/how-to-set-metadata-to-page-tsx-rendered-as-client-components#how-do-i-set-dynamic-metadata-that-depends-on-client-side-states
我刚刚试过了,它工作得很好。
new9mtju2#
我没有看到这种模式的描述,所以这是有点简单和切线相关的其他答案,但我想我也会分享。
请注意,这将取决于您的应用程序结构,但我发现它直观的只是有一个专用的标题组件,可以坐在服务器组件的
layout.tsx
<head>
,并有一个回退中列出的元数据,例如:字符串
在这种情况下,
<AppTitle>
可以在外部客户端组件中使用use client
定义,一旦页面在实现组件的逻辑中呈现,就可以自由引用window.location
来查找路径名,如果要检查路由参数,则可以引用useParams
。型
这并不完全理想,但在我看来,这比显式依赖
useEffect
要好,直到NextJS API有更好的替代方案,并且只是捕获客户端组件上的第一个可用渲染。