window.location.href vs history.pushState - 使用哪个?

Posted

技术标签:

【中文标题】window.location.href vs history.pushState - 使用哪个?【英文标题】:window.location.href vs history.pushState - which to use? 【发布时间】:2018-05-14 23:54:33 【问题描述】:

我一直在自学react-router,现在我想知道应该使用哪种方法转到另一个页面。

根据this post (Programmatically navigate using react router),您可以通过this.props.history.push('/some/path')转到另一个页面。

不过,老实说,我不太确定 window.location.hrefhistory.pushState 之间的区别。

据我了解,window.location.href = "/blah/blah"; 通过新的 HTTP 调用将您引导至另一个页面,该调用会刷新浏览器。

另一方面,history.pushState(和this.props.history.push('/some/path'))所做的是推送一个状态。显然,这会更改 HTTP 引荐来源网址并因此更新 XMLHttpRequest

这是mozila's documentation...的摘录

使用 history.pushState() 可以更改在您更改状态后创建的 XMLHttpRequest 对象的 HTTP 标头中使用的引荐来源网址。

在我看来,这两种方法都进行了新的 HTTP 调用。如果有,有什么区别?

我们将不胜感激。

附言

我认为开发人员在决定如何转到另一个页面之前,需要考虑是否有必要从服务器获取数据。

如果您需要从服务器检索数据,window.location.href 将 没关系,因为您将进行新的 HTTP 调用。但是,如果您使用的是<HashRouter>,或者您想避免为了速度而刷新页面,那么有什么好的方法呢?

这个问题让我发了这篇文章。

【问题讨论】:

【参考方案1】:

history.pushstate 进行新的 HTTP 调用(来自您引用的 mozilla 文档):

请注意,在调用 pushState() 之后,浏览器不会尝试加载此 URL,但它可能会在稍后尝试加载 URL,例如在用户重新启动浏览器之后。

window.location.href = "url" 将浏览器导航到新位置,因此它确实发出新的 http 请求。 注意:将新 url 指定为哈希片段时会出现例外情况。然后窗口只是滚动到相应的锚点


您可以从打开“网络”选项卡的 devTools 控制台检查是否运行它们。请务必启用“保留日志”选项。网络选项卡列出了所有新的 http 请求。

【讨论】:

感谢您的建议。但是,我仍然不能 100% 确定 Mozila 的文档说“history.pushState() 更改了在 HTTP 标头中使用的引荐来源网址”。是否可以假设更改 HTTP 标头中的引用者与进行新的 HTTP 调用无关? 另一个注意点是应用程序的状态。当history.push被使用时,状态被维持。但是,当使用window.location.href 时,状态返回到初始状态【参考方案2】:

您可以在控制台的网络中对此进行测试。将历史记录与反应路由器一起使用时,应用程序内不会进行刷新(无 http 请求)。您可以将其用于更好的 UX 流程和状态持久性。据我了解,我们本质上是在修改 url(没有 http 请求),并且 react 路由器使用模式匹配来根据这个编程更改呈现组件。

【讨论】:

【参考方案3】:

我在 react-router v3 中使用browserHistory。没有刷新,应用程序状态始终保持不变。 要重定向,我所做的只是browserHistory.push('\componentPath'),在应用程序的路由配置中映射的组件路径。

到目前为止没有任何问题,就像魅力一样。 希望对您有所帮助。

【讨论】:

以上是关于window.location.href vs history.pushState - 使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

window.location.href和window.location.replace的区别

使用 window.location.href跳转外部链接会拼上本项目链接失败

window.location.href=window.location.href 和 window.location.reload() 的区别

window.location和window.location.href的区别

一个关于window.location.href=window.location.href的问题?

“window.location.href”和“window.location.hash”有啥区别?