React Router продолжает отображать неправильную страницу

Был на этом все выходные. После обновления страницы React Router сначала продолжает маршрутизацию на страницу / login, а затем на домашнюю страницу «/».

ReactDOM.render(
<Provider store = {store}>
    <Router>
        <Switch>
        <Route path = "/login" component = {Login} />
            <AuthenticatedComponent>
            <Header />
            <Route path = "/" component = {App} exact />
            </AuthenticatedComponent>
        </Switch>
    </Router>
</Provider>,
document.getElementById("root")
);

Я пробовал перемещаться по маршрутам, но это не сработало - никаких ошибок, просто делает то же самое. Одно я делаю, это говорю. «Если пользователь вошел в систему (нет нуля), немедленно перенаправить его на домашнюю страницу» / ». Это делается в компоненте {Login} и написано ниже:

componentWillReceiveProps(props) {
    if (props.user !== null) {
        props.history.push('/')
    }
}

Это работает как шарм. Проблема в том, что всякий раз, когда я обновляю свой браузер, URL-адрес сразу переходит в / login, а затем в «/», который является домашним. Я добавил обертку AuthenticatedComponent в качестве последнего теста. Я написал в этом компоненте следующее:

componentWillMount(){
    if ( this.props.user !== null) {
        this.props.history.push('/')
    } else {
        this.props.history.push('/login')
    }
}

Я не получаю ошибок - просто немного не работает функционал

Как вам аутентифицировать пользователя? Я предполагаю, что вы не проверяете удаленный сервер, если пользователь вошел в систему после обновления браузера?

sn42 16.09.2018 11:01

Я собираюсь реализовать это позже, добавив «isAuthenticated», когда я буду обращаться к базе данных.

Chris Simmons 16.09.2018 11:02

Я думаю, вы не сохраняете государство? Например, аутентифицированный пользователь и прочитать его при обновлении страницы? В настоящее время у вас есть исходное состояние вашего приложения (например, пользователь не аутентифицирован) при каждом обновлении страницы.

sn42 16.09.2018 11:07

Аутентифицированный пользователь сохраняется в состоянии «пользователь», и я вызываю getUser () на страницах. Что ты посоветуешь?

Chris Simmons 16.09.2018 11:08

Итак, перефразируя мой предыдущий комментарий: в базовом приложении для реагирования все (реквизиты, состояние) будут сброшены при обновлении страницы. Это означает, что вам нужно либо сохранять данные, которые вы хотите сохранить при обновлении страницы, например, веб-хранилище или связь с вашим сервером для получения исходных данных при обновлении страницы (текущий аутентифицированный пользователь и т. д.)

sn42 16.09.2018 11:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
5
1 052
1

Ответы 1

Оберните <Switch> своим <AuthenticatedComponent> (и переместите <Header /> внутрь компонента аутентификации).

Или создайте Компонент HOC Wrapper (модульный и полезный, если некоторые маршруты требуют аутентификации, а некоторые нет).

Рабочий пример: https://codesandbox.io/s/5m2690nn6n

RequireAuth.js

import React, { Component, Fragment } from "react";
import { withRouter } from "react-router";
import Login from "./Login";
import Header from "./Header";

class RequireAuth extends Component {
  state = { isAuthenticated: false };

  componentDidUpdate = (prevProps, prevState) => {
    if (this.props.location.pathname !== prevProps.location.pathname && !this.state.isAuthenticated) {
      this.props.history.push("/");
    }
  };

  isAuthed = () => this.setState({ isAuthenticated: true });

  unAuth = () => this.setState({ isAuthenticated: false });

  render = () => (
    !this.state.isAuthenticated 
      ? <Login isAuthed = {this.isAuthed} />
      : <Fragment>
          <Header unAuth = {this.unAuth} />
          {this.props.children}
        </Fragment>
  );
}

export default withRouter(RequireAuth);

index.js

import React from "react";
import { render } from "react-dom";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import Home from "../components/Home";
import Players from "../components/Players";
import Schedule from "../components/Schedule";
import RequireAuth from "./components/RequireAuth";
import "uikit/dist/css/uikit.min.css";

render(
  <BrowserRouter>
    <RequireAuth>
      <Switch>
        <Route exact path = "/" component = {Home} />
        <Route exact path = "/players" component = {Players} />
        <Route path = "/schedule" component = {Schedule} />
      </Switch>
    </RequireAuth>
  </BrowserRouter>,
  document.getElementById("root")
);

Для тех, кто использует response-router v3:

index.js

render (
  <Router>
    <Route path = "/" component = {RequireAuth}>
      <IndexRoute component = {Home} />
      <Route path = "players" component = {Players} />
      <Route path = "schedule" component = {Schedule} />
    </Route>
  </Router>, document.getElementById("root")
);

Другие вопросы по теме