在我的NextJS应用程序中,我有一个在每个页面上都可见的语言选择器。当我选择一种新语言时,我只想通过在URL后面附加一个查询参数lang=en
来替换当前的URL。
以下是替换URL的函数:
const changeLanguage = (lang: LanguageID) => {
replace({
pathname,
query: { ...query, lang },
});
};
在本例中,replace
、query
和pathname
来自下一台路由器。
现在,所有东西都适用于静态路由,但我无法使其适用于动态路由。例如,我的文件夹结构如下:
pages
|_customers
|__index.tsx
|__[customerId].tsx
如果我在http://localhost/customers
上,我将我的语言更改为英语,URL将更改为http://localhost/customers?lang=en
,这正是我想要的。但是,如果我在http://localhost/customer/1
上,并且我将我的语言更改为英语,则URL将更改为http://localhost/customers/[customerId]?customerId=1&lang=en
,而不是我预期的http://localhost/customers/1?lang=en
。
现在,我知道我可以在路由器上使用asPath
,并通过将lang
附加到查询字符串对象来重新构建它,但我觉得下一步应该内置它。此外,我知道用香草JS可以很容易地完成,但这不是这里的重点。
我是不是遗漏了什么?有没有一种更简单的方法来将查询参数附加到动态路由,而无需进行服务器端重新呈现?
谢谢
7条答案
按热度按时间myzjeezk1#
只需向当前路由器添加更多参数,然后自行推送
iyzzxitl2#
如果我们想要将其作为链接--请这样使用:
olqngx593#
这个解决方案不需要发送之前的整个路由,因为
replace
只是替换了我们需要替换的内容,所以查询pars:fkvaft9z4#
我最终使用了我一开始就想避免的解决方案,即使用
asPath
值。至少,因为路径是相同的,所以没有进行服务器端重新渲染。下面是我更新的
changeLanguage
函数(stringifyUrl
来自query-string
包)x8diyxa75#
我尝试将我的参数添加到路由查询并推送路由器本身,正如前面提到的here,它起作用了,但收到了很多警告:
因此,我随后推送到
/
并按如下方式传递我的查询参数:我希望这对你也适用。
w1e3prcc6#
如果有人还在寻找下一步的答案,js^11.1.2,我希望这对你有帮助。
wa7juj8i7#
如果您在Next.js中有动态路由,并且希望对路由进行浅层调整以反映更新的查询参数,则另一种方法是尝试:
这将检索当前路径(
router.pathname
)和查询(router.query
)详细信息,并将它们与新的page
查询参数合并。如果您忘记合并现有的查询参数,您可能会看到如下错误:提供的HREF值缺少要正确内插的查询值