在 Next.js 中,将查询参数附加到动态路由上的常见方法是通过使用链接组件(Link
)或编程式导航(使用router.push
或router.replace
)来实现。
使用 Link 组件
当你使用 Next.js 的 Link
组件时,可以将查询参数作为对象传递给 href
属性。例如,假设你有一个动态路由 [id].js
,你可以这样创建一个链接:
jsximport Link from 'next/link'; const MyComponent = () => { return ( <Link href={{ pathname: '/post/[id]', query: { foo: 'bar' } }} as="/post/123?foo=bar"> <a>Go to Post</a> </Link> ); };
在这个例子中,pathname
是路由模式,query
对象包含了你想要附加的查询参数。as
属性是实际的URL,可能包含查询参数,用于浏览器地址栏展示。
使用编程式导航
如果你想要在代码中触发导航,可以使用 Next.js 的 useRouter
钩子来获取 router
对象,然后调用 push
或 replace
方法。
jsximport { useRouter } from 'next/router'; const MyComponent = () => { const router = useRouter(); const goToPost = () => { router.push({ pathname: '/post/[id]', query: { foo: 'bar' }, }, '/post/123?foo=bar'); }; return ( <button onClick={goToPost}>Go to Post</button> ); };
在这个例子中,pathname
和 query
对象结构与使用 Link
组件时相同,router.push
的第二个参数是实际的URL,用于浏览器地址栏显示。
注意事项
- 在
Link
组件或router.push
/router.replace
中,query
参数是可选的。你可以仅提供动态路由的路径,而不带查询参数。 - 当你在
as
参数或router.push
/router.replace
的第二个参数中直接提供查询参数时,确保正确地编码URL,尤其是当查询参数值包含特殊字符时。 - 在动态路由页面中,你可以通过
useRouter
钩子的query
对象访问这些查询参数。
下面是一个如何在动态路由页面中获取查询参数的例子:
jsximport { useRouter } from 'next/router'; const PostPage = () => { const router = useRouter(); const { id, foo } = router.query; return ( <div> <h1>Post: {id}</h1> <p>Query Parameter: {foo}</p> </div> ); }; export default PostPage;
这段代码展示了在动态路由页面 PostPage
中,如何使用 useRouter
的 query
对象来获取路由参数和查询参数。