[英]How can I create dynamic titles in next.js <head> section?
我有一个功能齐全的网站,但头部部分没有检索特定于页面的<title>
和<meta description>
。
例如,如果我在关于页面上,标题标签为“关于我”,我想在<title>
标签中呈现“关于我”。 我基本上需要的是在我的 Head 组件中加载由实际标题和描述组成的道具、变量或类似内容。 我已经在官方文档中阅读了一些示例,但是没有使用动态数据更新头部的示例。
这是我的组件的当前代码:
import React from 'react';
import NextHead from 'next/head';
const Head = ({ title, description }) => (
<NextHead>
<meta charSet="UTF-8" />
<title>My Website{title}</title>
<meta name="description" content={description || ''} />
<meta name="viewport" content="width=device-width, initial-scale=1" key="viewport" />
</NextHead>
);
我为帖子和页面创建了一个 Layout.js 组件。 我之前描述的<Head>
是在布局组件中导入的。
import React from 'react';
import Head from '../components/Head';
export default ({ children, as, settings = {}, title="default text" }) => (
<main>
<Head>
<title>{title}</title>
</Head>
<div className="app__container">
<div className="row">{children}</div>
</div>
</main>
);
我预计当我在/work/great-client时,我会看到一个更新的<title>
标签和great-client
我发现这个解决方案有点简单,代码行也更少。
_app.js:
export default function MyApp({ Component, pageProps }) {
return (
<>
<Head>
<title>{Component.title}</title>
</Head>
<Layout>
<Component {...pageProps} />
</Layout>
</>
);
}
主页.js:
Home.title = 'Homepage';
export default function Home() {
return (
<>
/* Some code */
</>
);
}
它应该是:
import React from 'react';
import Head from '../components/Head';
export default ({ children, as, settings = {}, title="default text" }) => (
<main>
<Head title={title}>
<div className="app__container">
<div className="row">{children}</div>
</div>
</main>
);
如果要将其用作 Head 的子级,则必须修改 Head 组件:
import React from 'react';
import NextHead from 'next/head';
const Head = ({ title, description, children }) => (
<NextHead>
<meta charSet="UTF-8" />
{children}
<meta name="description" content={description || ''} />
<meta name="viewport" content="width=device-width, initial-scale=1" key="viewport" />
</NextHead>
);
在尝试了第二个示例之后,我得到了它的工作。
下面的代码中有更多解释。
下面的示例代码显示了包含共享组件<Layout>
的 Post.js。 在布局中,我添加并添加了{props.meta.title}
。 现在可以检索页面/帖子特定的动态标题标签。
const Post = props => {
const {
content,
meta: { title },
} = props;
return (
<Layout>
<Head>
<title>{props.meta.title}</title>
</Head>
<div className="post">
<div className="content-inner">
<h1>{title}</h1>
<article dangerouslySetInnerHTML={{ __html: content }} />
</div>
</div>
</Layout>
);
};
Post.getInitialProps = function(reqOrContext) {
const { slug } = reqOrContext.query;
let content = require(`../work/${slug}.md`);
const converter = new Converter({ metadata: true });
content = converter.makeHtml(content);
const meta = converter.getMetadata();
return { content, meta };
};
export default withRouter(Post);
创建布局组件
从道具中解构孩子
添加到标题 {children.type.name}
console.log(children); return ( <> <Head> <title>{children.type.name.toLowerCase()}</title> </Head> <div className="layout">{children}</div> </> ); };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.