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обнаружит разницу и повторно визуализирует.Дополнительную информацию можно найти в руководствезаблокированные обновления .