typescript Next.js 13当前URL

6ljaweal  于 2023-10-22  发布在  TypeScript
关注(0)|答案(3)|浏览(112)

在SSR中,当我使用Next.js App Router时,我如何获得当前页面的完整URL?
我无法使用window.location.href,因为window未定义,并且使用useRouter()无法获得完整的URL

7cjasjjr

7cjasjjr1#

你说的完全正确,因为SSR中没有窗口对象,window.location.href不能使用,useRouter()钩子只能在客户端使用。但是,使用useRouter钩子,您可以在SSR中获取当前路径名

潜在解决方案

安装软件包npm install nextjs-current-url
您可以使用nextjs-current-url包中的getURL函数。它将req对象作为getServerSideProps中可用的输入。

export async function getServerSideProps(context) {
  const { req } = context;
  const the_url = await getUrl({ req });

  return {
    props: {
      the_url,
    },
  };
}

组件中的用法

const YourComponent = ({ the_url }) => {
  return (
    <div>
      <h1>{the_url}</h1>
    </div>
  );
};

export default YourComponent;

更新

你也可以使用AppRouter。您可以直接导入它并使用await关键字。

import { getUrl } from 'nextjs-current-url';

const YourComponent = () => {
  const url = await getUrl();

  return (
    <div>
      <h1>{url}</h1>
    </div>
  );
};

export default YourComponent;

第二版

记住上面的serverSideProps的例子,你可以使用类似的方法。你可以使用context对象。上下文对象包含有关当前请求的信息

import { getUrl } from 'nextjs-current-url';

const ServerComponentLayout = ({ children }) => {
  const the_url = getUrl({ req: context.req });

  return (
    <div>
      {children}
      <p>URL: {the_url}</p>
    </div>
  );
};

export default ServerComponentLayout;

然后在您的组件中,

<ServerComponentLayout>
  <h1>My Component</h1>
</ServerComponentLayout>
7d7tgy0s

7d7tgy0s2#

您可以使用next/headers来检索完整的头部,然后使用它来构造完整的url。

import { headers } from 'next/headers';

export default function ServerComponent() {
    const fullUrl = headers().get('referer');

    console.log(fullUrl);
}

或者你可以使用像hostx-forwarded-hostx-invoke-path这样的头文件(取决于你的情况下设置了哪些头文件)。

rdlzhqv9

rdlzhqv93#

我意识到这不是一个适用于所有用例的解决方案,也不是这个问题的直接答案,但是你可以使用spread操作符来获取 * 所有 * url参数,不管有多少参数。例如:

/app
  - page.tsx
  - layout.tsx
  /[...slug]
    - page.tsx

在你的/[.鼻涕虫]

const DetailPage = async ({ params }) => {

  console.log(params.slug)

  return (
    <div>...</div>
  )
}

所以www.website.com/hello/there/how/are/you将返回['hello', 'there', 'how', 'are', 'you']
然后,如果你知道你的baseUrl(我假设你会),你可以重新构造你的URL。

相关问题