如何在 Next.js 中将路径名从 _document 传递到 _app

Posted

技术标签:

【中文标题】如何在 Next.js 中将路径名从 _document 传递到 _app【英文标题】:How to pass pathname from _document to _app in Next.js 【发布时间】:2020-10-23 22:42:15 【问题描述】:

我是 Next.js 的新手,我很难将数据从 _document 传递到 _app。

我需要将路径名服务器端从_document.ts 传递到_app.ts,然后进入App 组件,以便我可以在Head 元素服务器端注入自定义标签。每个页面都有特定的链接。

例如<link rel="x-default" hrefLang="x-default" href="https://example.com/about-us">

将在页面https://example.com/about-us

当前的实现如下所示:

在 _document.tx 中获取初始属性

    const sheets = new ServerStyleSheets();
    const originalRenderPage = ctx.renderPage;

    ctx.renderPage = () =>
      originalRenderPage(
        enhanceApp: (App) => (props) => sheets.collect(<App ...props />),
      );
    const  lang  = ctx.query;
    const initialProps = await Document.getInitialProps(ctx);

    return 
      ...initialProps,
      pathname: ctx.asPath,
      locale: getLocaleFromLanguage(lang as SupportedLanguages),
      styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()],
    ;

_app.ts 的一部分

function App( Component, pageProps ) 
  console.log(pageProps)
  let  locale  = pageProps;
  if (!locale) 
    locale = DEFAULT_LOCALE;
  

  useEffect(() => 
    // Remove the server-side injected CSS.
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles) 
      jssStyles.parentElement.removeChild(jssStyles);
    
    smoothscroll.polyfill();
  , []);

当我console.log(pageProps) 我只得到例如 locale: 'en' 时,没有从_document.ts 传递的pathname 属性。

你知道如何将道具从 _document 传递到 _app

【问题讨论】:

我也有同样的问题。你解决了吗? @elyas.m 不,必须找到完全不同的方法.. 【参考方案1】:

我遇到了这个问题,我使用 req 对象将我的参数从 _app 发送到 _document。根据 NextJs 的解析顺序,我们可以使用 req (IncomingMessage) 对象。 服务器端NextJs解析顺序:

    app.getInitialProps page.getInitialProps document.getInitialProps app.render page.render document.render

在客户端:

    app.getInitialProps page.getInitialProps app.render page.render

示例 (TS):我从 _app 的 getInitialProps 函数向 _document 发送了一个名为 direction 的属性。

(ctx.req as any).direction = organization.direction;

在 _document 的 getInitialProps 中:

const direction = ctx.req.direction;

【讨论】:

以上是关于如何在 Next.js 中将路径名从 _document 传递到 _app的主要内容,如果未能解决你的问题,请参考以下文章

如何在服务器端渲染中将样式应用于 Next.js 中的 HTML?

如何在 Next JS 应用程序中将字符串转换为 HTML 元素?

在 next.js 中将反应导入页面

Next.js:如何在特定页面上更改根 div __next 的 css?

如何在 React 中将 JWT 发送到后端?

如何修复 Next.js 中 _app.js 中包含的 Sonarqube“重命名此文件”代码异味?