Почему корневой компонент не обновляется при изменении значения состояния редуктора? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь выполнить аутентифицированный маршрут, и проблема в том, что мой корневой компонент не обновляется при изменении значения редуктора 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 не обновлялся)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...