Я пытаюсь использовать React-Router V4 для добавления маршрутов в мое приложение, я пытаюсь
программно изменить маршрут с помощью history.push (), которая обновляет
URL браузера, но маршрут по-прежнему совпадает со старым URL.
ПРИМЕЧАНИЕ. Я использую redux.
Единственный ответ на этот вопрос:
wrapЛюбой компонент, связанный с резервированием, в котором есть компоненты маршрутизатора с помощью withRouter ().
Однако я попробовал ответить на поставленный выше вопрос, и он не работает для меня.
Вот важные фрагменты:
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import registerServiceWorker from './registerServiceWorker';
import Routes from './Routes.js';
import store from './Store.js';
import {Provider} from 'react-redux';
import './css/bootstrap.min.css';
import './css/navbar/chartist-custom.css';
import './css/navbar/main.css';
import './css/navbar/font-awesome.min.css';
import './css/navbar/style.css';
import {createBrowserHistory} from 'history'
const history = createBrowserHistory();
const App = () => {
return (<Provider store={store}>
<Routes history={history}/></Provider>);
}
ReactDOM.render(<App/>, document.getElementById('root'));
registerServiceWorker();
Routes.js
import React, {Component} from 'react';
import {
Route,
Switch,
Link,
BrowserRouter,
Router,
Redirect
} from 'react-router-dom';
import LoginPage from './views/pages/LoginPage.js';
import SuccessPage from './views/pages/SuccessPage.js';
import errorPage from './views/pages/errorPage.js';
import store from './Store.js';
class Routes extends Component {
constructor(props) {
super(props);
this.URLChange = this.URLChange.bind(this);
this.getOwnState = this.getOwnState.bind(this);
this.state = this.getOwnState();
}
getOwnState() {
return {
currentURL: store.getState()["currentURL"]
};
}
URLChange() {
console.debug(this.getOwnState()["currentURL"]);
this.props.history.push(this.getOwnState()["currentURL"]);
//setState是异步的
let currentURL = this.getOwnState()["currentURL"];
this.setState(Object.assign({
currentURL
}, {currentURL}), () => {
//回调方法
console.debug("1:" + this.state.currentURL)
})
}
componentDidMount() {
store.subscribe(this.URLChange);
}
render() {
alert("render:" + JSON.stringify(this.props.history.location.pathname));
return (<BrowserRouter >
<Switch>
<Route exact="exact" path="/" component={errorPage}/>
<Route exact="exact" path="/LoginPage" component={LoginPage}/>
<Route exact="exact" path="/SuccessPage" component={SuccessPage}/>
<Route exact="exact" path="/errorPage" component={errorPage}/>
<Route exact="exact" path="/*" component={errorPage}/>
</Switch>
</BrowserRouter>);
}
}
export default Routes;
LoginPage.js :
...
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(LoginPage));
SuccessPage.js :
...
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(SuccessPage));
И я обнаружил, что при рендере возвращается Маршрут
<Route path="/LoginPage" component={LoginPage}/>
, а не
<Route path="/SuccessPage" component={SuccessPage}/>
, но можно использовать <Link>
изменить вид:
<Link to="/SuccessPage">SuccessPage</Link>