React маршрутизатор V4 NavLink активный маршрут
Я пытаюсь перенести свой проект с V3 из react-router
на v4 из того, что теперь называется react-router-dom
. Теперь проблемы возникают, когда у меня есть компонент MenuBar, который полностью отделен от логики маршрутизации (как вы и ожидали), потому что он будет показывать те же самые ссылки, независимо от текущего пути. Теперь это хорошо работало с v3, но теперь, когда я использую NavLink
, который имеет то же самое свойство activeClassName
, активный маршрут не обновляется на NavBar, только на refresh. Это кажется немного глупым, так что ... должен быть способ обойти это.
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
будет смотреть на текущий и следующий реквизиты, и если нет разницы, он не будет повторно отображаться. Это проблема, потому что по умолчанию React Router использует контекст для передачи данных и полагается на повторную визуализацию элементов для получения обновленных значений, ноobserver
' ssCU
не имеет способа обнаружить контекст изменения.Способ обойти это-передать объект
location
в качестве опоры компоненту, обернутому вobserver
. Затем, когда местоположение изменится,observer
' sshouldComponentUpdate
обнаружит разницу и повторно визуализирует.Дополнительную информацию можно найти в руководствезаблокированные обновления .