React Router v4 NavLink 活动路由

IT技术 javascript reactjs react-router react-router-v4
2021-04-30 11:45:25

我正在尝试将我的项目从使用 v3 of 的react-router现在称为 v4 的react-router-dom. 现在,当我有一个 MenuBar 组件时会出现问题,该组件与路由逻辑完全分离(如您所料),因为无论当前路径是什么,它都会显示完全相同的链接。现在这与 v3 一起工作得很好,但是现在当我使用NavLink具有相同activeClassName属性的 时,活动路由不会在 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>
    );
  }
}

以上是我的主要应用逻辑,正如您所看到的,路由是嵌套的,但路由器本身环绕整个组件。

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

1个回答

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

解决这个问题的方法是将location对象作为props传递给由observer. 然后,当位置发生变化时,observer'sshouldComponentUpdate将检测差异并重新渲染。

您可以查看阻止更新指南以获取更多信息。