【问题标题】:React Router v4 NavLink active routeReact Router v4 NavLink 活动路由
【发布时间】:2017-08-02 19:23:21
【问题描述】:

我正在尝试将我的项目从使用 react-router 的 v3 移植到现在称为 react-router-dom 的 v4。现在,当我有一个与路由逻辑完全分离的 MenuBar 组件时问题就出现了(正如您所期望的那样),因为无论当前路径是什么,它都会显示完全相同的链接。现在这与 v3 配合得很好,但是现在当我使用具有相同 activeClassName 属性的 NavLink 时,活动路由不会在 NavBar 上更新,只会在刷新时更新。这似乎有点愚蠢,所以一定有办法解决这个问题。

export default @inject('ui') @observer class App extends Component {
  render() {
    return (
      <Router>
        <div className={ styles.wrapper }>
          <Sidebar />
          <main className={ `${styles.main} ${!this.props.ui.menuOpen && styles.closed}` }>
            <Route exact path="/" component={ HomePage } />
            <Route path="/signup" component={ SignUpPage } />
            <Route path="/login" component={ LoginPage } />
            <Route path="/about" component={ AboutPage } />
          </main>
          <footer className="site-footer"></footer>
        </div>
      </Router>
    );
  }
}

上面是我的主要应用逻辑,你可以看到路由是嵌套的,但是路由器本身包裹了整个组件。

我应该添加什么才能让它们再次工作? (它们在页面刷新时确实可以正常工作)

【问题讨论】:

    标签: javascript reactjs react-router react-router-v4


    【解决方案1】:

    根据您对@observer 装饰器的使用,您似乎正在使用mobx-react。关于observer 要了解的是它实现了shouldComponentUpdate 以优化渲染性能。那个sCU调用会查看当前和下一个props,如果没有区别就不会重新渲染。这是一个问题,因为默认情况下,React Router 使用上下文来传递数据并依赖元素重新渲染来获取更新的值,但observersCU 无法检测到上下文变化。

    解决此问题的方法是将location 对象作为道具传递给observer 包装的组件。然后,当位置发生变化时,observershouldComponentUpdate 会检测到差异并重新渲染。

    您可以查看blocked updates guide 了解更多信息。

    【讨论】:

    • 感谢您的回答。我确实怀疑 MobX,因为目前只有导航菜单连接到它。我还考虑将位置作为道具传递,但认为必须有一种更优雅的方式来做到这一点,因为这样我需要对每个应该更新路由并存储更改的组件进行此操作。
    • 再次感谢您的回答,因为您确实为我指明了正确的方向。我最终从我的大多数组件中删除了 observer 逻辑,因为它们并不真正需要它,并且它使组件免于在 MobX 打算时专门更改。
    猜你喜欢
    • 2018-01-20
    • 2021-03-07
    • 2019-06-16
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多