2017-03-12 3 views
6

私のプロジェクトで、v3をreact-routerからv4に移植して、現在はreact-router-domとしています。これで問題は、MenuBarコンポーネントがあるときに発生します。これは、現在のパスが何であっても正確に同じリンクを表示するため、ルーティングロジックとは完全に別です(予想通り)。今はv3ですべてうまく動作しましたが、今度は同じactiveClassNameプロパティを持つNavLinkを使用している場合、アクティブなルートはNavBarで更新されず、更新時にのみ更新されます。これはちょっとばかげているようですので、これを回避する手段が必要です。 リアクタールーターv4 NavLinkアクティブルート

上記を

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> 
 
    ); 
 
    } 
 
}

は私のメインのアプリケーションロジックであり、あなたが見ることができるようにルートがネストされているが、ルータ自体は、コンポーネント全体を包みます。

もう一度動作させるにはどうすればよいですか? (これらはページの更新時に正しく機能します)

答えて

4

@observerデコレータの使用状況に基づいて、mobx-reactを使用しているようです。 observerについて理解することは、レンダリングのパフォーマンスを最適化するためにshouldComponentUpdateを実装することです。そのsCUコールは現在と次の小道具を見て、違いがなければ再レンダリングしません。デフォルトでは、React Routerはコンテキストを使用してデータを渡し、要素を再レンダリングして更新された値を取得するため、observersCUはコンテキストの変更を検出できません。

これを回避する方法は、で囲まれたコンポーネントの小道具としてlocationオブジェクトを渡すことです。次に、場所が変更されると、observershouldComponentUpdateがその違いを検出して再レンダリングします。

詳細については、blocked updates guideをご覧ください。

+0

ありがとうございました。私は本当にMobXを疑っていました。なぜなら、現在のところナビゲーションメニューだけがそれに接続されているからです。私はまた、場所を小道具として渡すことを検討しましたが、それを行うためのよりエレガントな方法が必要であると考えました。その方法では、ルートで更新して変更を保存する必要がある各コンポーネントで行う必要があります。 –

+0

もう一度、ありがとうございました。正しい答えを教えてくれました。私は、実際にそれを必要としないので、ほとんどのコンポーネントから 'observer'ロジックを削除してしまい、MobXが意図したときにコンポーネントが排他的に変更されることを免れました。 –

+0

....... briliant。 – Tomasz