React 路由器 - 更新 URL 哈希而不重新渲染页面

Posted

技术标签:

【中文标题】React 路由器 - 更新 URL 哈希而不重新渲染页面【英文标题】:React router - Update URL hash without re-rendering page 【发布时间】:2014-12-02 01:34:53 【问题描述】:

使用react-router 我正在寻找一种方法来更新页面 URL / 哈希,而无需路由器重新呈现整个页面。

我正在开发一个整页轮播,并希望每张幻灯片都有自己的 URL(允许用户刷新页面并返回到正确的幻灯片)。轮播稍后会有类似于this demo 的滑动,这意味着下一张幻灯片已预渲染。

我的旋转木马的精简版可用here。

当前幻灯片更改如下所示:

onClickLeft: function() 
  this.setState(
    selected: this.state.selected - 1
  );

这工作正常,没有 URL 更新。我真正想要的是:

mixin: [Navigation],
onClickLeft: function() 
  this.transitionTo('carousel-slide', num: this.state.selected + 1);

这将设置当前幻灯片的道具,允许轮播动画。但是现在使用此方法会导致页面重新渲染并且不显示动画。

我看到ReactCSSTransitionGroup 用于路由转换,但这似乎是为了呈现新页面并转换旧页面。

如果已经有一种方法可以实现我正在寻找的东西,但我错过了,有人能指出我正确的方向吗?

【问题讨论】:

尝试在您的处理程序中将this.props.activeRouteHandler() 更改为this.props.activeRouteHandler(key: "test")。这有帮助吗? 虽然我不知道为什么,但这有效!我不得不将它与componentWillReceiveProps 结合起来以捕捉更新的道具并调用setState,但仍然非常棒!想要将此作为答案添加以便我接受吗? 这只是一种预感,我没有时间去测试它。下面回答:-) 在底部查看我对react router v4的回答。 【参考方案1】:

1.0

react-router 不再在你的路由上设置一个键。如果您确实需要从路由处理程序中设置键,请将其放在周围元素上。

return (
  <div key=this.props.params.bookId>
    this.props.children
  </div>
);

0.13

现在是 &lt;ReactRouter.RouteHandler key="anything" /&gt;,但由于 react-router 的变化,它也不再需要。有关详细信息,请参阅更改日志。

0.12

目前,react-router 根据当前路由在您的处理程序上设置一个键。当 react 进行 diff 并注意到不同的键时,它会抛出虚拟和真实 dom 中的整个子树,并重新渲染。

为了防止这种情况,您可以在使用 activeRouteHandler() 时覆盖 react-router 的键

this.props.activeRouteHandler(key: "anything")

【讨论】:

@FakeRainBrigand 从更新日志中不清楚,现在如何在 React Router 与 1.0.0 中使用新的历史模块来完成此任务。您是否有机会更新此内容或为我指明正确的方向?【参考方案2】:

使用 react-router 很痛苦,因为它涉及到每个主要和次要版本中的重大更改

React Router v2.0 rc5

import  hashHistory  from 'react-router'
this.props.location.query.t = key;
hashHistory.replace(this.props.location);

【讨论】:

@Kousha, hashHistory 用于在# 之后 的URL 上设置的路径。 browserHistory 用于非散列 URL,如您的起始示例。 v 4.0 有什么办法吗?或更高 检查我对 v4 的回答【参考方案3】:

对于 React router v4,您需要使用 history 并将其作为 prop 传递给 Router。然后Router 会将history 对象作为道具传递给您的组件,您可以像这样使用它:

// In your component

this.props.history.push("#testing")

历史档案

// history.js 
import createHistory from "history/createBrowserHistory";

export default createHistory();

然后,无论你在哪里声明你的路由器,都传递 history 属性

import history from "./history";
import  Router  from "react-router-dom";

    <Router history=history>
      // ... Your component
    </Router>

【讨论】:

你知道如何在 v5 中进行这项工作吗?我在控制台中得到这个:“警告:请使用require("history").createBrowserHistory 而不是require("history/createBrowserHistory")。对后者的支持将在下一个主要版本中删除。”我尝试了这个建议,但它破坏了网站。 在 v5 中修改历史记录也会重新渲染页面。

以上是关于React 路由器 - 更新 URL 哈希而不重新渲染页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Router v5 中更新 URL 并替换历史状态而不重新渲染整个应用程序?

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

我在使用 React 路由器时遇到问题,因为我的 url 在点击它时会得到更新,但页面没有被呈现

react-router-dom 路由组件需要页面重新加载

当 url 匹配相同的路由时,React 路由器不会重新加载页面

如果 url 中的所有更改都是哈希,如何强制页面重新加载?