ReactJs Проблема с отображением домашней страницы после входа пользователя - PullRequest
0 голосов
/ 13 февраля 2020

Я использую паспорт. js и jwt токен для обработки состояния пользователя аутентификация в моем приложении реакции. После входа пользователя я сохраняю токен в localStorage и, таким образом, в зависимости от того, есть ли токен в localStorage или нет, я обновлю свойство состояния isAuthenticated .
Теперь, когда гость пользователь (не прошедший проверку подлинности) пользователь открывает приложение, у него не должно быть доступа к домашней странице приложения.
Поэтому я разделил маршруты, к которым guest user может получить доступ, и аутентифицированный пользователь может получить доступ к двум различным переменным guestLinks и authLinks .
И в зависимости от свойства isAuthenticated я выведу одну из них ,

Приложение. js

class App extends Component {
  render() {
    const authLinks = (
      <Switch>
        <Route
          exact
          path="/"
          name="Login Page"
          render={props => <Login {...props} />}
        />
        <Route
          exact
          path="/404"
          name="Page 404"
          render={props => <Page404 {...props} />}
        />
        <Route
          exact
          path="/500"
          name="Page 500"
          render={props => <Page500 {...props} />}
        />
        <Route
          path="/home"
          name="Home"
          render={props => <DefaultLayout {...props} />}
        />
      </Switch>
    );

    const guestLinks = (
      <Switch>
        <Route
          exact
          path="/"
          name="Login Page"
          render={props => <Login {...props} />}
        />
        <Route
          exact 
          path="/register"
          name="Register Page"
          render={props => <Register {...props} />}
        />
        <Route
          exact
          path="/404"
          name="Page 404"
          render={props => <Page404 {...props} />}
        />
        <Route
          exact
          path="/500"
          name="Page 500"
          render={props => <Page500 {...props} />}
        />
      </Switch>
    );

    const currentState = store.getState();
    console.log(
      "currentState.auth.isAuthenticated: ",
      currentState.auth.isAuthenticated
    );
    return (
      <Provider store={store}>
        <HashRouter>
          <React.Suspense fallback={loading()}>
            {console.log(currentState.auth.isAuthenticated)}
            {/* TODO: Not sure if this always works. If after the user logsin he gets a blank page and he has to reload to be redirected to home then
            this way of routing may need to modified */}
            {currentState.auth.isAuthenticated ? authLinks : guestLinks}
          </React.Suspense>
        </HashRouter>
      </Provider>
    );
  }
}  

Обратите внимание на эту строку:

{currentState.auth.isAuthenticated? authLinks: guestLinks}
Таким образом, после входа пользователя в систему (для проверки подлинности) он перенаправляется на домашнюю страницу:

class Login extends Component {
  constructor() {
    super();
    this.state = {
      email: "",
      mot_de_passe: "", 
      errors: ""
    };
    this.onChange = this.onChange.bind(this);
    this.onSubmit = this.onSubmit.bind(this);
  }
  componentDidMount() {
    // If the user has already logged-in and he attempts to access the login page this will redirect him to home
    if (this.props.auth.isAuthenticated) {
      this.props.history.push("/home");
    }
  }
  //This runs when the component receives new properties
  componentWillReceiveProps(nextProps) {
    // After the user has logged-in this will redirect him to home
    if (nextProps.auth.isAuthenticated) {
      this.props.history.push("/home");
    }
    if (nextProps.errors) {
      this.setState({ errors: nextProps });
    }
  }

  onChange(e) {
    this.setState({
      [e.target.name]: e.target.value
    });
  }

  onSubmit(e) {
    console.log(e);
    // Since it's a form, we don't want it to have its default behavior
    e.preventDefault();
    const userInfo = {
      email: this.state.email,
      password: this.state.mot_de_passe
    };
    // Any action that we bring-in is going to be stored inside props
    //this.props.loginUser(userInfo, this.props.history);
     this.props.loginUser(userInfo);
  }
  render() {
    return (
      <div className="app flex-row align-items-center">
        <Container>
          <Row className="justify-content-center">
            <Col md="8">
              <CardGroup>
                <Card className="p-4">
                  <CardBody>
                    <Form noValidate onSubmit={this.onSubmit}>
                      <h1>Se connecter</h1>
                      <p className="text-muted">
                        Connectez-vous à votre compte
                      </p>
                      <InputGroup className="mb-3">
                        <InputGroupAddon addonType="prepend">
                          <InputGroupText>
                            <i className="icon-user"></i>
                          </InputGroupText>
                        </InputGroupAddon>
                        {/* WORK_HERE */}
                        <Input
                          name="email"
                          type="text"
                          placeholder="Email"
                          value={this.state.email}
                          onChange={this.onChange}
                        />
                      </InputGroup>
                      <InputGroup className="mb-4">
                        <InputGroupAddon addonType="prepend">
                          <InputGroupText>
                            <i className="icon-lock"></i>
                          </InputGroupText>
                        </InputGroupAddon>
                        <Input
                          name="mot_de_passe"
                          type="password"
                          placeholder="Mot de passe"
                          autoComplete="current-password"
                          value={this.state.mot_de_passe}
                          onChange={this.onChange}
                        />
                      </InputGroup>
                      <Row>
                        <Col xs="6">
                          <Button color="primary" className="px-4">
                            Se connecter
                          </Button>
                        </Col>
                        <Col xs="6" className="text-right">
                          <Button color="link" className="px-0">
                            Mot de passe oubliée?
                          </Button>
                        </Col>
                      </Row>
                    </Form>
                  </CardBody>
                </Card>
                <Card
                  className="text-white bg-primary py-5 d-md-down-none"
                  style={{ width: "44%" }}
                >
                  <CardBody className="text-center">
                    <div>
                      <h2>Bienvenue au Viwone SAV</h2>
                      <p>
                        Suivez en temps réel l'évolution des opérations du
                        service après-vente.
                      </p>
                    </div>
                  </CardBody>
                </Card>
              </CardGroup>
            </Col>
          </Row>
        </Container>
      </div>
    );
  }
}

Проблема заключается в том, что после входа в систему он получить пустой экран , и он должен перезагрузить страницу, чтобы домашняя страница была успешно отображена.
Кажется, что ссылки authLink загружаются недостаточно быстро, чтобы приложение могло обнаружить ссылку на домашний экран.

1 Ответ

1 голос
/ 13 февраля 2020

В вашем App.js получите значение isAuthenticated, используя connect(), так что после повторного рендеринга с последним значением isAuthencticated после входа в систему вы увидите обновленные URL

...