Почему он направляет меня обратно на страницу входа, даже если пользователь аутентифицирован?

#reactjs #react-router-dom

#реагирует на #реагировать-маршрутизатор-дом

Вопрос:

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

Это мое app.js:

 import React from "react" import { BrowserRouter, Routes, Route, Navigate, useLocation } from "react-router-dom"  import AuthContextProvider from "../Contexts/AuthContext" import { useAuth } from "../Contexts/AuthContext"  import Login from "../Pages/Authentication/Login" import Home from "../Pages/Home"  const App = () =gt; {  return (  lt;AuthContextProvidergt;  lt;BrowserRoutergt;  lt;Routesgt;  lt;Route path="/login" element={lt;Login /gt;} /gt;  lt;Route  path="/home"  element={  lt;RequireAuthgt;  lt;Home /gt;  lt;/RequireAuthgt;  }  /gt;  lt;/Routesgt;  lt;/BrowserRoutergt;  lt;/AuthContextProvidergt;  ) }  function RequireAuth({ children }) {  const { currentUser } = useAuth()  return currentUser ? children : lt;Navigate to="/login" replace /gt; }  export default App   

это мой аутентификационный контекст:

 import React, { createContext, useContext, useEffect, useState } from "react" import { auth } from "../firebase/Firebase-config" import {  signInWithEmailAndPassword,  onAuthStateChanged,  signOut, } from "firebase/auth"  const AuthContext = createContext({  currentUser: null,  login: () =gt; Promise,  logout: () =gt; Promise, })  export const useAuth = () =gt; useContext(AuthContext)  export default function AuthContextProvider({ children }) {  const [currentUser, setCurrentUser] = useState(null)   useEffect(() =gt; {  const unsubscribe = onAuthStateChanged(auth, (user) =gt; {  setCurrentUser(user ? user : null)  })  return () =gt; {  unsubscribe()  }  }, [])   useEffect(() =gt; {  console.log("The user is", currentUser)  }, [currentUser])   function login(email, password) {  return signInWithEmailAndPassword(auth, email, password)  }   function logout() {  return signOut(auth)  }   const value = {  currentUser,  login,  logout,  }  return lt;AuthContext.Provider value={value}gt;{children}lt;/AuthContext.Providergt; }   

это то, что возвращает контекст аутентификации

введите описание изображения здесь

Комментарии:

1. что возвращает useAuth? вы также можете добавить этот файл сюда. так что вы можете получить некоторую помощь

2. @TheWuif, если я обновил свой вопрос. Он возвращает объект пользователя, прошедшего проверку подлинности, или значение null, если пользователь не прошел проверку подлинности.

Ответ №1:

вы можете использовать undefined состояние, если хотите.

 const [currentUser, setCurrentUser] = useState(undefined)  

чем будут возможные состояния currentUser undefined null , или user то , и вы можете проверить это. По умолчанию это будет undefined так, просто перейдите, если это так null .

 function RequireAuth({ children }) {  const { currentUser } = useAuth()  if(currentUser) {  return children;  }  if(currentUser === null) {  return lt;Navigate to="/login" replace /gt;;  }  return null; }  

Комментарии:

1. Это действительно сработало, спасибо.

Ответ №2:

Вы сохраняете своего пользователя в состоянии, вот почему. Когда вы обновите страницу, все вернется к своему первоначальному значению. Вам действительно необходимо использовать файлы cookie или локальное хранилище с состоянием для хранения необходимой информации.

Комментарии:

1. Как, например, магазин redux?

2. Я не очень много знаю о Redux. Вы можете сделать это с ванилью javaScript . Когда вы входите в систему пользователя, вы сохраняете его в своем состоянии, как вы это делаете, но также и в локальном хранилище, например, вот так loacalStorage.setItem('user', JSON.stringify(user)) . И вы можете получить к нему такой доступ JSON.parse(loacalStorage.getItem('user')) , чтобы проверить, вошел ли пользователь в систему после обновления.

3. если вы используете redux, вы должны сохранить состояние redux

4. но ответ от @yousoumar правильный, или вы используете undefined, я скоро добавлю пример для undefined. я пишу на нем