Я пытаюсь выполнить аутентифицированный маршрут, и проблема в том, что мой корневой компонент не обновляется при изменении значения редуктора loggedIn
(запускается в компоненте входа в систему).В результате authed
prop не обновляется также в PrivateRoute
Root:
import React, { Component } from "react";
import { Provider } from "react-redux";
// import { BrowserRouter, Route, browserHistory, Switch } from "react-router";
import { HashRouter as Router, Route, Switch, Redirect} from "react-router-dom";
import { hot } from 'react-hot-loader'
import { ConnectedRouter } from 'connected-react-router'
import configureStore, {history} from '../store/configureStore'
import App from "./App";
import Startpage from "./startpage";
import PatientSearch from "./routes/patient/patientSearch";
import Technician from "./routes/technician/technician";
import Notes from "./routes/notes/notes";
import DeliveryReports from './routes/admin/deliveryReports/reports'
import Analytics from './routes/admin/analytics/analytics'
import {connect} from 'react-redux'
import * as actions from "../actions";
import Login from './login';
import Cookies from "cookies-js";
const store = configureStore(/* provide initial state if any */)
const PrivateRoute = ({ component: Component, authed, ...rest }) => (
<Route {...rest} render={(props) => (
authed === true
? <Component {...props} />
: <Redirect to={{
pathname: '/login',
state: { from: props }
}} />
)} />
)
class Root extends Component {
state = {loggedIn:false}
componentWillMount() {
this.props.dispatch(actions.isLoggedIn())
console.log('hellOOOO')
this.checkCookie()
}
componentDidUpdate(prevProps) {
console.log('rootprops', this.props.loggedIn, prevProps.loggedIn)
this.props.loggedIn!==prevProps.loggedIn&&this.setState({loggedIn:this.props.loggedIn})
}
render() {
console.log('propsroot', this.state.loggedIn)
return (
<Provider store={store}>
<ConnectedRouter history={history}>
<Router >
<App>
<Switch>
<PrivateRoute exact path="/" authed={this.state.loggedIn} component={Startpage} />
<Route
component={PatientSearch}
path="/patient/search"
/>
<PrivateRoute
component={Technician}
path="/technician"
authed={this.state.loggedIn}
/>
<Route
component={Login}
path="/login"
/>
<Route
component={Analytics}
path="/analytics"
/>
<Route
component={Notes}
path="/notes"
/>
<Route
component={DeliveryReports}
path="/delivery_reports"
/>
</Switch>
</App>
</Router>
</ConnectedRouter>
</Provider>
);
}
}
const mapStateToProps=(state)=>{
return {
loggedIn: state.app.loggedIn,
token: state.app.token,
};
}
export default connect(mapStateToProps)(hot(module)(Root))
ComponentDidUpdate не запускается, даже если действие отправлено и значениеloggedIn изменен.
Редукторная часть:
case "SIGN_IN":
return {
...state,
loggedIn:true,
errors:''}
РЕДАКТИРОВАТЬ: перемещены маршруты в компонент приложения, и там все работает нормально.Однако возникает другая проблема: когда я перезагружаюсь или загружаю веб-приложение в первый раз, оно перенаправляется на компонент Login
.Журналы показывают, что loggedIn
изначально ложно, но затем становится истинным, но компонент все равно не отображается (предположим, authed
не обновлялся)