Reactjs MobX+;React路由器4+@当路由更改时,withRouter始终重新渲染

Reactjs MobX+;React路由器4+@当路由更改时,withRouter始终重新渲染,reactjs,mobx,react-router-v4,mobx-react,react-router-dom,Reactjs,Mobx,React Router V4,Mobx React,React Router Dom,我使用MobX@observer和@withRouter(react-router-v4)这样的包装页面组件 @withRouter @inject('stores') @observer class Page extends Component { render() { return ( <div> <NavBar /> <Header title={this.props.stores.UIStore.tit

我使用MobX@observer和@withRouter(react-router-v4)这样的包装页面组件

@withRouter
@inject('stores')
@observer
class Page extends Component {
  render() {
    return (
      <div>
        <NavBar />
        <Header title={this.props.stores.UIStore.title} />
        <Switch>
          <Route exact path="/" component={HomePage} />
          <Route exact path="/about" component={AboutPage} />
          <Route component={NotFound} />
        </Switch>
      </div>
    )
  }
@withRouter
@注入('存储')
@观察者
类页面扩展组件{
render(){
返回(
)
}
问题
当路由位置更改时,导航栏和标题组件始终使用相同的道具重新渲染(无任何状态更新)。当路由更改时,react perf显示许多浪费的渲染(无道具/状态更新)

导航栏包括链接和一些MobX状态(仅使用@observer+@inject包装导航栏)
Header只是一个无状态组件

页面组件需要@withRouter导致@observer(MobX)中断反应路由器()


如何防止路由位置更改导致导航栏和标题重新渲染?仅允许在mobx状态更新时重新渲染。

我知道这很旧,但这就是我在项目中解决相同问题的方法:

  • 不要与路由器和观察者一起使用。如果位置或匹配对象发生更改,shouldComponentUpdate的观察者实现将返回true
  • 当您只需要历史记录或位置对象时,请使用mobx react router()中的routerStore
  • 当您需要匹配时(通常是因为参数),制作一个使用withRouter的非观察者组件,并将必要的参数传递给层次结构的较低级别

  • 我是否遗漏了什么,或者这是一种预期行为?在更改路径时,您的
    页面
    组件将重新呈现,其所有子组件也将重新呈现谢谢您Nikita!这为我节省了很多时间。遵循了第一步和第二步,解决了我面临的问题。不过,我还没有检查第三步。