react-router:如何在不导致导航/重新加载的情况下更新 url?

str*_*rks 32 javascript reactjs react-router

使用反应路由器我已经完成了更新网址:

this.props.history.push({
            pathname: `/product/${this.props.product.id}`,
        });
Run Code Online (Sandbox Code Playgroud)

但是,这会导致重新渲染/导航更改。有没有办法在不这样做的情况下更新网址?

我的用例是我有一个产品列表,当我点击一个产品列表时,我会显示一个模态并希望将 url 更新为 example.com/product/1 之类的内容,以便链接可以共享。

小智 44

无法使用 React Router 找到解决方案,但可以通过调用浏览器的历史记录界面来完成此操作:

window.history.replaceState(null, "New Page Title", "/pathname/goes/here")
Run Code Online (Sandbox Code Playgroud)

您可以.replaceState 在此处了解更多信息。

React Routerhistory.replace并不总是有效

React Router 的history.replace方法可能会也可能不会触发重新渲染,具体取决于您的应用程序的路由设置(例如,您有一个包罗万象的/*路由)。它不会根据定义阻止渲染。

  • 请注意,如果稍后再次修改,此更改可能会绕过 React Router 对当前路径的了解。EG 如果您使用此方法附加 1 个子路径,然后使用 RR 向上导航 1 级,它会在视觉上跳转 2,因为 RR 仍然认为该位置没有附加子路径。 (4认同)
  • @usr28765526 我的观点是,如果你使用 React Router 来处理导航,那么使用浏览器 API `replaceState` 可以被视为“黑客”,并且 RR 将不知道路径发生了变化。如果您在修改 URL 后尝试使用 React Router 的“location”,它将对其所知道的 URL 版本进行操作:更改之前的版本。这可能是不可预测且令人困惑的。 (3认同)

Ang*_*zar 9

替换将覆盖 URL

this.props.history.replace({ pathname: `/product/${this.props.product.id}`})
Run Code Online (Sandbox Code Playgroud)

  • 这肯定仍然会导致路由器采取行动,然后出现空白屏幕(我猜它找不到路线) (3认同)
  • 我发现这个有效: window.history.replaceState(null, null, `/product/${this.props.product.id}`); (2认同)
  • 反应路由器替换应该表现得像replaceState。我可以确认替换不会触发渲染,请检查这个小演示 https://jsbin.com/jinazirowa/edit?html,js,output (2认同)
  • 只要路由器路径封装了新路径,这应该无需刷新/重新渲染即可工作。 (2认同)