我目前正在做一个Next.js项目,我试图使用next/navigation
的useSearchParams
或useParams
钩子来访问URL段。我使用Rewrite参数将source: '/chat/:id'
Map到destination: '/chat'
,因此它被重写到带有:id
段的聊天页面。然而,我遇到了一个问题,useParams返回一个空对象,useSearchParams返回null。
import { useParams, useSearchParams } from 'next/navigation'
export default function MyComponent() {
// Current URL -> '/chat/1' (/chat/:id)
const params = useParams()
const searchParams = useSearchParams()
console.log("params", params) // This logs an empty object {}
console.log("searchParams", searchParams.get("id")) // This logs null
}
我知道useParams只返回dynamic params,就像/chat/[id]
一样,但是当我导航到像/chat/:id
这样的URL时,我希望searchParams.get("id")
返回:id
的值,但是它返回null。从next/router
得到router.query
,它给出了正确的值。是否无法使用next/navigation
访问:id
段?
这是useSearchParams
和useParams
在尝试访问URL段时的预期行为吗?还是我错过了什么?
P.S. next/navigation
似乎也不会导出beforePopstate
或其他路由器事件。
编辑:刚刚意识到usePathname()
返回带有:id
段的路径名,这与从next/router
返回的路径名值的行为不同,它只返回/chat
,这是实际的路径名。
1条答案
按热度按时间ie3xauqp1#
useSearchParams
钩子函数用于获取放置在页面路径名之后的值,例如过滤器和其他值。例如,您可以将http://appname/chat/[id]
作为路径名,然后在浏览器中搜索http://appname/chat/1?value=2
。使用
useSearchParams().get("value")
,你会得到值2
,使用useParams().id
,你会得到值1
。您应该使用useParams
获取路径名中的值,并使用useSeachParams
获取路径名后面的值。