[英]ReactJs this.props.history.push() is not working
我是Reactjs的新手,出於某種原因,我正在開發一個小型應用程序以進行學習。
我正在使用react-router-dom在不同組件之間導航。
這個想法是當用戶單擊以注銷時,應用程序組件應在componentWillUpdate()方法中檢測到注銷事件,然后將用戶重定向到“登錄組件”。
Routes.js
import React from 'react';
import { BrowserRouter, Route, Switch, Link, NavLink } from 'react-
router-dom';
import Login from '../Components/LoginComponent/Login';
import AddNoteForm from "../Components/AddNoteForm";
const AppRouter = () => (
<BrowserRouter>
<Switch>
<Route path="/" component={AddNoteForm} exact={true} />
<Route path="/login" component={Login} exact={true} />
</Switch>
</BrowserRouter>
);
export default AppRouter;
Index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import configureStore from './Redux/Store/ConfigureStore';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
const store = configureStore();
const jsx = (
<Provider store={store}>
<MuiThemeProvider>
<App />
</MuiThemeProvider>
</Provider>
);
ReactDOM.render(jsx, document.getElementById('root'));
registerServiceWorker();
App.js
import React, { Component } from 'react';
import './App.css';
import { Grid, Col, Row } from 'react-bootstrap';
import Navigation from "./Components/Navigation";
import AddNoteForm from "./Components/AddNoteForm";
import Clock from "./Components/Clock";
import { connect } from 'react-redux';
import AppRoutes from "./Routes/Routes";
class App extends Component {
constructor(props) {
super(props);
}
componentWillUpdate(nextProps, nextState) {
if (nextProps.store.user.email === null || nextProps.store.user.email
== undefined) {
this.props.history.replace('/login');
}
}
render() {
return (
<div className="App">
<header className="App-header">
<h1 className="App-title">Welcome to this Learing React
Application.</h1>
</header>
<div className="App-intro" >
<Navigation></Navigation>
<Grid>
<Row className="show-grid">
<AppRoutes />
</Row>
</Grid>
</div>
</div>
);
}
}
const mapStateToProps = (store) => {
return { store };
};
export default connect(mapStateToProps)(App);
Package.json
{
"name": "first-react",
"version": "0.1.0",
"private": true,
"dependencies": {
"install": "^0.11.0",
"material-ui": "^0.20.0",
"npm": "^6.0.0",
"react": "^16.2.0",
"react-bootstrap": "^0.32.1",
"react-dom": "^16.2.0",
"react-redux": "^5.0.7",
"react-router-dom": "^4.2.2",
"react-scripts": "1.1.1",
"react-spinner": "^0.2.7",
"react-spinners": "^0.3.2",
"react-toastify": "^4.0.0-rc.5",
"redux": "^4.0.0",
"redux-thunk": "^2.2.0",
"uuid": "^3.2.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
}
您的App
組件沒有被BrowserRouter
包裝。 您需要像這樣包裝它:
const Routes = () => (
<Switch>
<Route path="/" component={AddNoteForm} exact={true} />
<Route path="/login" component={Login} exact={true} />
</Switch>
);
const jsx = (
<Provider store={store}>
<MuiThemeProvider>
<BrowserRouter>
<div>
<AppRouter />
<Route component={App} />
</div>
<BrowserRouter>
</MuiThemeProvider>
</Provider>
);
為了在道具中包含history
,可以使用withRouter 。
如下更新App.js
文件:
import { withRouter } from 'react-router'
...
export default withRouter(connect(mapStateToProps)(App));
請使用https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Redirect.md ,您可以僅在App.js
渲染組件
componentWillUpdate(nextProps, nextState) {
if (nextProps.store.user.email === null || nextProps.store.user.email
== undefined) {
return <Redirect to="/login" />
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.