Я хочу отобразить стартовую страницу на основе входа пользователя в систему или отсутствия реакции

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

Это мой App.js:

import "./App.css";
import "bootstrap/dist/css/bootstrap.min.css";
import Signup from "./Components/Signup";
import Login from "./Components/Login";
import { Routes, Route, Navigate } from "react-router-dom";
import HomePage from "./Components/HomePage";
import { useEffect, useState } from "react";

function App() {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const authStatus=localStorage.getItem('auth')

  const setAuth = (value) => {
    setIsAuthenticated(value);
    //alert(value);
  };
  useEffect(()=>{
    setIsAuthenticated(authStatus)
  },[])
  return (
    <>
      <Routes>
        <Route path = "/" element = {<HomePage  />} />
        <Route path = "/login" element = {<Login />} />
        <Route path = "/signup" element = {<Signup />} />
      </Routes>
    </>
  );
}

export default App;

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

Это мой логин.js:

import React, { useState } from "react";
import Form from "react-bootstrap/Form";
import Button from "react-bootstrap/Button";
import { Link, useNavigate } from "react-router-dom";

const initialValues = {
  email: "",
  password: "",
};

export default function Login({setAuth}) {
  const navigate = useNavigate();
  const [values, setValues] = useState(initialValues);
  function validateForm() {
    return values.email.length > 0 && values.password.length > 0;
  }

  const handleSubmit = (e) => {
    e.preventDefault();
    Login();

    
  };

  const handleInputChange = (e) => {
    e.preventDefault();
    const { name, value } = e.target;
    setValues({
      ...values,
      [name]: value,
    });
  };

  function Login() {
    let retrievedData = localStorage.getItem("registeredUsers");
    let users = JSON.parse(retrievedData);
    let Found = users.find(function (user, index) {
      if (user.email === values.email && user.password === values.password) {
        return true;
      }
    });
    if (Found) {
      
      setAuth(true)
      let auth = true;
      localStorage.setItem("auth", JSON.stringify(auth));
      //navigate("/");
    } else {
      alert("Error email/password");
    }
  }

  return (
    <div className = "LoginContainer">
      <div style = {{ display: "flex", width: "100%" }}>
        <Form onSubmit = {handleSubmit}>
          <Form.Group size = "lg" controlId = "email">
            <Form.Label>Email</Form.Label>
            <Form.Control
              autoFocus
              type = "email"
              name = "email"
              value = {values.email}
              onChange = {handleInputChange}
            />
          </Form.Group>
          <Form.Group size = "lg" controlId = "password">
            <Form.Label>Password</Form.Label>
            <Form.Control
              type = "password"
              name = "password"
              value = {values.password}
              onChange = {handleInputChange}
            />
          </Form.Group>
          <Button
            style = {{ marginTop: 10, width: 400 }}
            block
            size = "lg"
            type = "submit"
            // disabled = {!validateForm()}
          >
            Login
          </Button>
        </Form>
      </div>
      <text style = {{ marginTop: 10 }}>
        Don't have an account? <Link to = "/signup">Register</Link>
      </text>
    </div>
  )
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы получаете информацию auth из локального хранилища, но на самом деле нигде ее не используете. Вы должны иметь возможность выполнять условный маршрут в зависимости от того, аутентифицирован ли пользователь или нет. Что-то вроде этого.

<Routes>
  <Route path = "/" element = { isAuthenticated ? <HomePage  /> : <Login />} />
  <Route path = "/login" element = {<Login />} />
  <Route path = "/signup" element = {<Signup />} />
</Routes>

Или вы также можете использовать перенаправление при запуске метода setAuth. Если текущий путь / и у них нет файла cookie auth, перенаправьте их на /login

Этот отвечать объясняет несколько различных способов достижения перенаправления, если вы выбрали этот путь.

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

Tanjil Pranto 18.03.2022 16:21
Ответ принят как подходящий

Проблемы

  1. Ваше начальное состояние isAuthenticated соответствует вашему неаутентифицированному состоянию.
  2. Рендеринг не обрабатывает условный рендеринг домашней страницы или перенаправление на вашу страницу входа.
  3. Компоненту Login не передается обратный вызов setAuth.

Решение

Инициализируйте isAuthenticated из localStorage, используйте хук useEffect с зависимостью от isAuthenticated, чтобы сохранить изменения состояния аутентификации в localStorage.

function App() {
  const [isAuthenticated, setIsAuthenticated] = useState(
    () => JSON.parse(localStorage.getItem('auth')) || false
  );

  const setAuth = (value) => {
    setIsAuthenticated(value);
    //alert(value);
  };

  useEffect(()=>{
    localStorage.setItem("auth", JSON.stringify(isAuthenticated));
  }, [isAuthenticated]);

  return (
    <>
      <Routes>
        <Route
          path = "/"
          element = {isAuthenticated
            ? <HomePage  />
            : <Navigate to = "/login" replace />
          }
        />
        <Route path = "/login" element = {<Login setAuth = {setAuth} />} />
        <Route path = "/signup" element = {<Signup />} />
      </Routes>
    </>
  );
}

Авторизоваться

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

const handleSubmit = (e) => {
  e.preventDefault();
  login();
};

...

function login() {
  const users = JSON.parse(localStorage.getItem("registeredUsers")) || [];
  const found = users.some(user => user.email === values.email && user.password === values.password);

  if (found) {
    setAuth(found);
    navigate("/", { replace: true });
  } else {
    alert("Error email/password");
  }
}

решение сработало для меня. Спасибо

Tanjil Pranto 22.03.2022 05:37

@TanjilPranto Добро пожаловать, рад помочь! Здоровья и удачи.

Drew Reese 22.03.2022 05:38

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