React router 4 не обновляет представление по ссылке, но обновляет его
Я использую следующий простой код навигации
<Router>
<Switch>
<Route exact path='/dashboard' component={Dashboard} />
<Route path='/dashboard/accounts' component={AccountPage} />
</Switch>
</Router>
<NavLink exact to={'/dashboard'}
disabled={this.props.item.disabled}
activeClassName='active'>
<NavLink exact to={'/dashboard/accounts'}
disabled={this.props.item.disabled}
activeClassName='active'>
URL-адрес изменяется, но представление не меняется. Однако он меняется, когда я обновляю страницу или вручную захожу на этот URL.
5 ответов
Вы также можете использовать:
import { withRouter } from 'react-router-dom';
А затем по умолчанию при экспорте вы делаете это так:
export default withRouter(connect(mapStateToProps, {})(Layout));
Потому что, когда у вас есть экспортное соединение, вы должны сказать, что этот компонент будет использовать маршрутизатор.
Это потому что react-redux
connect
метод реализует shouldComponentUpdate
что приведет к тому, что компонент не будет отображаться, когда реквизиты не изменятся. И это противоречит сейчас с реакции-маршрутизатором 4.
Чтобы избежать этого, вы можете пройти {pure: false}
в connect
как описано в разделе "Устранение неполадок реагирующего редуктора"
Другой способ заключается в использовании withRouter
HOC или пройти location
опора, как описано в DOCS.
У меня были свои Navlinks в компоненте без состояния (или немом компоненте) и контейнере, чтобы управлять состоянием коллапса моей панели навигации.
после переключения navbar-контейнера из PureComponent
в Component
это решило проблему для меня.
Вы пытались убедиться, что теги вашего маршрутизатора охватывают весь фрагмент кода?
<Router>
<Switch>
<Route exact path='/dashboard' component={Dashboard} />
<Route path='/dashboard/accounts' component={AccountPage} />
</Switch>
<NavLink exact to={'/dashboard'}
disabled={this.props.item.disabled}
activeClassName='active'>
<NavLink exact to={'/dashboard/accounts'}
disabled={this.props.item.disabled}
activeClassName='active'>
</Router>
Выглядит странно, но включение ссылок в
<Router>
распространяет изменение вашего пути на компоненты маршрутизатора, когда вы щелкаете ссылку, и фактически отображает компонент, к которому вы направляетесь. Я только что исправил очень похожую проблему.
Я столкнулся с этой проблемой. Я разрешаю это путем добавления атрибута ключа к компоненту. Переключатель со значением - это имя пути и местоположение.