Ich versuche, grundlegende Authentifizierung fließen in meiner App zu reagieren.Reagieren Router v4 Authentifizierung Problem
Ich verwende redux und redux-persist, um meinen Zustand in localstorage zu speichern.
Hier ist eine PrivateRoute
Komponente, Benutzerauthentifizierung zu überprüfen, dann umleiten, um sich anzumelden oder die tatsächliche Komponente (die privat ist).
Es funktioniert gut, wenn authenticated
auf false gesetzt ist. Aber wenn ich mich erfolgreich anmelde, rendert es meine Komponente nicht sogar meine authenticated
war wahr. (I protokolliert Variablen und ich sah, authentifiziert ist wahr, Erfolg anmelden)
import React from 'react';
import PropTypes from 'prop-types';
import { Route } from 'react-router';
import { Redirect } from 'react-router-dom';
import { isAuth } from 'redux/actions/auth/A_auth';
import App from 'layout/pages/App';
import { connect } from 'react-redux';
class PrivateRoute extends React.Component {
constructor(props) {
super(props);
}
render() {
const {authenticated, component: Component, ...rest } = this.props;
console.log(this.props);
return (
<Route {...rest} render={props => (
authenticated ? (
<App>
<Component {...props}/>
</App>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
);
}
}
PrivateRoute.propTypes = {
authenticated: PropTypes.bool
};
const mapStateToProps = state => {
return {
authenticated: state.auth.authenticated
}
};
export default connect(mapStateToProps)(PrivateRoute);
Wenn authenticated == false
es Umleitungen an Login.js
aber, wenn seine true
es stellt nicht die tatsächliche Komponente machen. Wenn ich if-Anweisung entfernte und <App><Component.../></App
rendert, funktioniert es gut, aber Authentifizierung funktioniert in diesem Fall nicht.
Hier ist meine index.js, die Root-Render ist.
render(
<Provider store={store}>
<Router children={routes}/>
</Provider>, window.document.getElementById('app'));
Und hier ist mein routes.js
import React from 'react';
import { Route } from 'react-router-dom';
import Home from 'layout/pages/home';
import NewClient from 'layout/pages/newclient';
import EditClient from 'layout/pages/editclient';
import Login from 'layout/pages/login';
import PrivateRoute from 'routes/PrivateRoute';
export default (
<div>
<PrivateRoute path="/" component={Home} exact/>
<PrivateRoute path="/home" component={Home} exact/>
<PrivateRoute path="/client/new" component={NewClient}/>
<PrivateRoute path="/client/edit/:apiKey" component={EditClient}/>
<Route path="/login" component={Login}/>
</div>
);
Dank.