Маршрутизатор React V4 не работает с Redux
разработка приложения React с помощью React router v4. Все работало хорошо, пока я не представил Redux в своем приложении. С тех пор при щелчке ссылок для изменения маршрута url браузера изменяется, но компонент, соответствующий маршруту, не загружается. Это хорошо работает, если я комментирую код Redux. Что могло быть причиной этого? Вот мой код для маршрутизации:
import React, { Component } from 'react';
import { Switch, Route, Link } from 'react-router-dom';
import LeftSubDefault from './../components/left-sub-default.component';
import LeftSubOne from './../components/left-sub-one.component';
import LeftSubTwo from './../components/left-sub-two.component';
import { withRouter } from 'react-router-dom';
import { connect } from "react-redux";
import { goToLeftDefault, goToLeftOne, goToLeftTwo } from "./../actions/leftRouteActions.js";
class LeftComponent extends Component {
render() {
return (
<div className="col-xs-6">
<p>
Current sub route: {this.props.currentRoute}
</p>
<ul>
<li onClick={this.props.goToDefault}><Link to={'/'}>Go To Default</Link></li>
<li onClick={this.props.goToSub1}><Link to={'/left-sub1'}>Go To One</Link></li>
<li onClick={this.props.goToSub2}><Link to={'/left-sub2'}>Go To Two</Link></li>
</ul>
<Switch>
<Route exact path='/' component={LeftSubDefault} />
<Route exact path='/left-sub1' component={LeftSubOne} />
<Route exact path='/left-sub2' component={LeftSubTwo} />
</Switch>
</div>
);
}
}
const mapStateToProps = (store) => {
return {
currentRoute: store.routes.currentRoute
};
}
const mapDispatchToProps = (dispatch) => {
return {
goToDefault: () => {
dispatch(goToLeftDefault())
},
goToSub1: () => {
dispatch(goToLeftOne())
},
goToSub2: () => {
dispatch(goToLeftTwo())
}
};
}
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(LeftComponent));
PS:Я не получаю ошибок в консоли. Код работает чисто, только компоненты не загружаются. Вот аналогичная нить на github: 4671. Я видел много потоков на разных сайтах, но ни у одного нет решения для этой проблемы.
2 ответов
ха, теперь я делаю проект с react-router и redux тоже =).
посмотрите официальную документацию об интеграции redux https://reacttraining.com/react-router/web/guides/redux-integration.
Я думаю, что главное-порядок withRouter
и connect
Hocs.
проблема в том, что Redux реализует shouldComponentUpdate, и нет никаких признаков того, что что-то изменилось, если он не получает реквизит от обращать в бегство. Это легко исправить. Найдите, где вы подключаете свой компонент и оберните его в withRouter.
из официальных документов.
UPD
import { withRouter } from 'react-router-dom';
import { connect } from 'react-redux';
class Home extends React.Component {...}
export default withRouter(
connect(mapStateToPropsFunc)(Home)
);
Я использую react-router-dom v4.1.1. Это работает на меня. Вот моя демо
import React from 'react';
import Reducer1 from 'yourReducer1';
import Reducer2 from 'yourReducer2';
import {
Route,
Switch as RouterSwitch
} from 'react-router-dom';
const App =()=> (
<RouterSwitch>
<Route path="/link1" exact component={Reducer1}/>
<Route path="/link2" exact component={Reducer2}/>
</RouterSwitch>
);
export default App;
надеюсь, что это полезно для вас ^^