React-Router 活动类不适用于嵌套路由

Posted

技术标签:

【中文标题】React-Router 活动类不适用于嵌套路由【英文标题】:React-Router active class is not working for nested routes 【发布时间】:2016-11-11 15:33:44 【问题描述】:

我查看了几个 github 问题和类似的帖子,但我无法弄清楚。我在这里有我的路线:

  <Router history=browserHistory>
    <Route path='/' component=Main>
      <IndexRoute component=Landing />
      <Route path='login' component=LoginContainer />
      <Route path='user' component=UserContainer onEnter=checkAuth >
        <Route path='home' component=HomeContainer />
        <Route path='settings' component=SettingsContainer />
        <Route path='doc_attributes' component=AttributesContainer />
        <Route path='groups' component=GroupsContainer />
        <Route path='rules' component=RulesContainer />
      </Route>
      <Route path='/dropbox/auth_finish' onEnter=doDropbox />
      <Route path='/box/auth_finish' onEnter=doBox />
      <Route path='/googledrive/auth_finish' onEnter=doGDrive />
      <Route path='/onedrive/auth_finish' onEnter=doOneDrive />
    </Route>
  </Router>

这里是感兴趣的链接:

<li><Link to='/user/home' activeClassName="activeLink"><i className="fa fa-home fa-3x fa-fw" aria-hidden="true"></i></Link></li>
<li><Link to='/user/settings' activeClassName="activeLink"><i className="fa fa-wrench fa-3x fa-fw" aria-hidden="true"></i></Link></li>
<li><Link to='/user/groups' activeClassName="activeLink"><i className="fa fa-users fa-3x fa-fw" aria-hidden="true"></i></Link></li>
<li><Link to='/user/rules' activeClassName="activeLink"><i className="fa fa-tasks fa-3x fa-fw" aria-hidden="true"></i></Link></li>

链接加载得很好,但他们从来没有得到活动类 CSS。只有加载的第一条路线得到它,没有别的。有人有什么想法吗?

【问题讨论】:

第一条路线是指/user/home'/' /user/home,或刷新页面时 url 中的任何路由 【参考方案1】:

所以,这个问题被问到已经有一段时间了,但我想出了答案,所以我应该分享一下。

在渲染组件并接收导航状态更新的容器中,我需要将pure: false 放入连接函数中。本质上,它与这样一个事实有关,即如果您的组件不是“纯”的(更新仅来自道具),那么它依赖于反应上下文来重新渲染。这是代码块:

const NavContainer = ReactRedux.connect( MapStateToProps, MapDispatchToProps, null, pure: false )(Nav)

问题文档:https://github.com/reactjs/react-redux/blob/master/docs/troubleshooting.md

帮助我解决的问题:https://github.com/ReactTraining/react-router/issues/3286

【讨论】:

谢谢。当我偶然发现你的问题时,我正要发布同样的问题。【参考方案2】:

你可以使用 componetDidMount 而不是 onEnter

这里的好处是,您还可以将它与componentWillUnmount 一起使用,例如删除计时器或清除缓存。

我希望这会有所帮助,这里有一些关于这个主题的额外信息 :) https://facebook.github.io/react/docs/component-specs.html#mounting-componentdidmount

【讨论】:

和这个问题有关系吗? 是的,而不是使用他提到的有问题的 activeClass,他可以直接在每个组件中使用 componentDidMount() 方法,他将确切知道从哪里加载了什么,以及卸载任何代码的选项他已启用。 但问题是,onEnter 应该对 activeClass 声明绝对没有影响。 它不应该,但我假设您遇到类似于 github.com/reactjs/react-router/issues/1996 的问题。这就是为什么我认为你有更好的选择直接使用 reactjs 基本组件来完成你的工作。不过,这只是一个建议,也许经过更多实验的开发人员会提出更好的解决方案。

以上是关于React-Router 活动类不适用于嵌套路由的主要内容,如果未能解决你的问题,请参考以下文章

嵌套组件不适用于 Angular 中的路由

使用 react-router 和 IndexRoute 嵌套路由(反应路由器布局)

在 react-router 中找不到嵌套路由的字体

react-router 未渲染的嵌套详细信息路由

react-router4 嵌套路由

在 react-router 中路由嵌套 url