在SSR中,当我使用Next.js App Router时,我如何获得当前页面的完整URL?我无法使用window.location.href,因为window未定义,并且使用useRouter()无法获得完整的URL
window.location.href
window
useRouter()
7cjasjjr1#
你说的完全正确,因为SSR中没有窗口对象,window.location.href不能使用,useRouter()钩子只能在客户端使用。但是,使用useRouter钩子,您可以在SSR中获取当前路径名
useRouter
潜在解决方案
安装软件包npm install nextjs-current-url您可以使用nextjs-current-url包中的getURL函数。它将req对象作为getServerSideProps中可用的输入。
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关键字。
await
import { getUrl } from 'nextjs-current-url'; const YourComponent = () => { const url = await getUrl(); return ( <div> <h1>{url}</h1> </div> ); }; export default YourComponent;
第二版
记住上面的serverSideProps的例子,你可以使用类似的方法。你可以使用context对象。上下文对象包含有关当前请求的信息
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>
7d7tgy0s2#
您可以使用next/headers来检索完整的头部,然后使用它来构造完整的url。
next/headers
import { headers } from 'next/headers'; export default function ServerComponent() { const fullUrl = headers().get('referer'); console.log(fullUrl); }
或者你可以使用像host,x-forwarded-host和x-invoke-path这样的头文件(取决于你的情况下设置了哪些头文件)。
host
x-forwarded-host
x-invoke-path
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。
www.website.com/hello/there/how/are/you
['hello', 'there', 'how', 'are', 'you']
3条答案
按热度按时间7cjasjjr1#
你说的完全正确,因为SSR中没有窗口对象,
window.location.href
不能使用,useRouter()
钩子只能在客户端使用。但是,使用useRouter
钩子,您可以在SSR中获取当前路径名潜在解决方案
安装软件包
npm install nextjs-current-url
您可以使用
nextjs-current-url
包中的getURL
函数。它将req
对象作为getServerSideProps
中可用的输入。组件中的用法
更新
你也可以使用AppRouter。您可以直接导入它并使用
await
关键字。第二版
记住上面的serverSideProps的例子,你可以使用类似的方法。你可以使用
context
对象。上下文对象包含有关当前请求的信息然后在您的组件中,
7d7tgy0s2#
您可以使用
next/headers
来检索完整的头部,然后使用它来构造完整的url。或者你可以使用像
host
,x-forwarded-host
和x-invoke-path
这样的头文件(取决于你的情况下设置了哪些头文件)。rdlzhqv93#
我意识到这不是一个适用于所有用例的解决方案,也不是这个问题的直接答案,但是你可以使用spread操作符来获取 * 所有 * url参数,不管有多少参数。例如:
在你的/[.鼻涕虫]
所以
www.website.com/hello/there/how/are/you
将返回['hello', 'there', 'how', 'are', 'you']
。然后,如果你知道你的baseUrl(我假设你会),你可以重新构造你的URL。