我是Reactjs的新手,出于某些原因,我正在为一个小型应用程序进行学习。
我使用react-router-dom在不同的组件之间导航。
这个想法是当用户点击退出时,App Component应该检测componentWillUpdate()方法中的logout事件,然后将用户重定向到Login Component。
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"
}
}
答案 0 :(得分:3)
您的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>
);
答案 1 :(得分:1)
为了在道具中使用history
,您可以使用withRouter
更新App.js
文件,如下所示:
import { withRouter } from 'react-router'
...
export default withRouter(connect(mapStateToProps)(App));
答案 2 :(得分:0)
请使用https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Redirect.md,您只需在PassThrough
App.js