[英]Change URl without page refresh NEXT.JS
我正在使用NEXT.JS
和Redux
开发电子商务商店。 因此,在产品列表页面中,我对 select 下拉列表进行了排序, Price Low to High
, Price High to Low
和New Arrivals
。 选择此选项后,我想在不刷新页面的情况下更改 URL,并且应该调用 API。 我试过使用下面的代码,但它不起作用并且页面正在重新加载。
function sortBy(value) {
router.replace({
pathname: '/products/'+slug,
query: { sort: value }
})
dispatch(fetchproducts(slug, sort));
}
上面的代码只是刷新当前页面并将sort
参数附加到 URL。
那么是否可以像Flipkart
那样在没有页面刷新的情况下做到这一点。
借助 URL 的shallow-routing
更改,无需重新加载页面是可能的。 它可以通过将显式选项 object 作为第三个参数传递给Router.push
来启用,即{ shallow: true }
从文档
浅路由允许您更改 URL 而无需再次运行数据获取方法,包括
getServerSideProps
、getStaticProps
和getInitialProps
。您将通过
router
object(由useRouter
或withRouter
添加)收到更新的pathname
和query
,而不会丢失 state。
例如,您将如何在shallow-routing
的帮助下更新路径名/products
的查询参数sortBy
。
Router.push({
pathname: '/products',
query: { sortBy: 'price' }
},
undefined, { shallow: true }
)
但是有一些注意事项不同页面之间不可能进行shallow-routing
,它仅适用于同一页面 URL 更改。 有关更多详细信息,请参阅警告部分。
例如,您可以更新页面/product
页面的查询参数,但如果您尝试从/product
到/product/[slug]
进行shallow-routing
,则这是不可能的,因为它们是两个不同的页面。
// page will reload because shallow-routing not possible between the pages
Router.push('/product', '/product/some-product?sortBy=price', { shallow: true })
示例:您有一个文件夹,如:posts/[id].js 和您的 url 就像http://something.com/posts/123
您想添加一个不会刷新页面的查询参数,您的 url 将类似于: http://something.com/posts/123?param=ok
您需要做的就是:
const postId = 123;
const param = 'ok';
router.push(
{
pathname: `/posts/[id]`,
query: {
postId,
param
}
},
`/posts/${postId}?param=${param}`,
{shallow: true}
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.