мое приложение для реагирования использует useContext для хранения информации о логине и пользователе, но если я перейду, изменив URL-адрес, вся информация будет потеряна и все будет сброшено

import Home from "./pages/home/Home";
import Profile from "./pages/profile/Profile";
import Login from "./pages/login/Login";
import Register from "./pages/register/Register";
import Messenger from "./pages/messenger/Messenger";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Redirect,
} from "react-router-dom";
import { useContext } from "react";
import { AuthContext } from "./context/AuthContext";

function App() {
  const { user } = useContext(AuthContext);
  console.log(user);
  return (
    <Router>
      <Switch>
        <Route exact path="/">
          {user ? <Home /> : <Register />}
        </Route>
        <Route path="/login">{user ? <Redirect to="/" /> : <Login />}</Route>
        <Route path="/register">
          {user ? <Redirect to="/" /> : <Register />}
        </Route>
        <Route path="/messenger">
          {!user ? <Redirect to="/" /> : <Messenger />}
        </Route>
        <Route path="/profile/:username">
          {!user ? <Redirect to="/" /> : <Profile />}
        </Route>
        <Route path="*">
          {user ? <Profile /> : "404 ERROR: Page does not exists"}
        </Route>
      </Switch>
    </Router>
  );
}

export default App;
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { AuthContextProvider } from "./context/AuthContext";

ReactDOM.render(
  <React.StrictMode>
    <AuthContextProvider>
      <App />
    </AuthContextProvider>
  </React.StrictMode>,
  document.getElementById("root")
);

Вот так выглядит мой файл приложения. Не уверен, почему переход по приложению через URL-адрес приводит к тому, что приложение всегда сбрасывается.

Например, в приложении есть виджет, который при нажатии перенаправляет пользователя в чужой профиль. Но если я перейду к профилю этого человека, используя вместо этого URL-адрес, все сбрасывается.


person free_lions_n_tigers_from_cages    schedule 25.06.2021    source источник
comment
Обернут ли ваш компонент приложения поставщиком контекста, который вызывает createContext()? reactjs.org/docs/context.html#reactcreatecontext   -  person j-petty    schedule 25.06.2021
comment
да, пожалуйста, посмотрите обновление   -  person free_lions_n_tigers_from_cages    schedule 25.06.2021
comment
Вы имеете в виду, что вводите новый адрес в адресную строку или нажимаете <Link/>? Контекст теряется при обновлении страницы, но не при правильных ссылках маршрутизатора. Я спрашиваю, потому что я не вижу ссылок или useHistory в вашем коде.   -  person zero298    schedule 25.06.2021
comment
@ zero298 Я считаю, что ввожу новый адрес в адресную строку. Если манипулирование адресной строкой приведет к потере всего состояния, что же тогда решить?   -  person free_lions_n_tigers_from_cages    schedule 25.06.2021
comment
@ zero298 и да, при нажатии на страницу обновления все сбрасывается.   -  person free_lions_n_tigers_from_cages    schedule 25.06.2021
comment
Используйте некоторую библиотеку сохранения контекста. stackoverflow.com/a/53455443   -  person zero298    schedule 25.06.2021


Ответы (1)


Контекст React не сохраняется при прямом переходе по URL-адресу.

React Router обрабатывает изменения URL-адресов в приложении, но, изменяя URL-адрес напрямую, вы говорите браузеру снова загрузить страницу. Ваше приложение должно будет обрабатывать выборку необходимых данных и повторное заполнение контекста React, если страницы переходят напрямую.

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

Существуют способы сохранения данных между сеансами, но по возможности этого следует избегать. Как мы можем использовать то же состояние на нескольких вкладках (страницах) в React

person j-petty    schedule 25.06.2021