Где в приложении на React хранить флаг авторизирован ли пользователь или нет

145
01 ноября 2019, 05:40

Имеется компонент:

import React from 'react';
import {  Route, Switch, Redirect } from 'react-router-dom';
const Header = React.lazy(() => import('./Components/Header/Header'));
const RegistrationForm = React.lazy(() => import('./Components/Forms/RegistrationForm/RegistrationForm'));
const LogonForm = React.lazy(() => import('./Components/Forms/LogonForm/LogonForm'));
import ContentLayout from './Layouts/ContentLayout/ContentLayout';
import DepartmentForm from './Components/Forms/DepartmentForm/DepartmentInput';
import './App.css';
export default class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            loggedIn: false
        };
        this.logIn = this.logIn.bind(this);
    }
    logIn() {
        this.setState({
            loggedIn: true
        })
    }
    render() {
        return (
            <React.Fragment>
                <Header />
                    <Switch>
                        <Route exact path="/" render={ () => (this.state.loggedIn ? (<DepartmentForm/>) : (<Redirect to="/login"/>))}/>
                        <Route exact path="/login" render={ () =>  <LogonForm logIn={ this.logIn } />  } />
                        <Route exact path="/registration" render={ (props) => <RegistrationForm {...props} /> } />
                    </Switch>
            </React.Fragment>
        )
    }
};

Флаг авторизации я храню в state. Насколько это правильно? И как сделать чтоб при обновлении страницы это состояние не сбрасывалось?

Answer 1

Храните признак того, что пользователь авторизован в localStorage, таким образом при перезагрузке страницы это состояние не будет сбрасываться.

Свойство localStorage позволяет получить доступ к локальному Storage объекту. Данные в свойстве localStorage не имеют ограничений по времени хранения и могут быть удалены только с помощью JavaScript, то есть не имеют определенного времени жизни.

Пример использования:

constructor(props) {
  super(props);
  this.state = {
    loggedIn: !!localStorage.getItem('loggedIn'),
  };
}
logIn() {
  this.setState({ loggedIn: true });
  localStorage.setItem('loggedIn', 'yes');
}
logOut() {
  this.setState({ loggedIn: true });
  localStorage.removeItem('loggedIn');
}

Вот такой простой пример использования localStorage в качестве хранилища. Полезные ссылки для ознакомления и изучения:

  • Storage - интерфейс Storage из Web Storage API
  • Window.localStorage - хранилище localStorage
  • Window.sessionStorage - хранилище sessionStorage
  • Storage.getItem() - вернет значение, лежащее в хранилище по указанному ключу
  • Storage.setItem() - добавит этот ключ в Storage или обновит его значение
  • Storage.removeItem() - удалит из Storage элемент с указанным ключем
  • Storage.key() - числовое значение n и возвращает имя nо ключа из Storage
  • Storage.clear() - удалить все ключи из Storage
  • Storage.length - количество элементов в объекте Storage
READ ALSO
Проверка на наличие значения в атрибуте lang тега &lt;html&gt;

Проверка на наличие значения в атрибуте lang тега <html>

Всем доброго времени суток, помогите плз, не могу разобраться почему не работает условие

133
Работа с com в JS

Работа с com в JS

Иногда все работает корректно, а иногда считывается только один символПри отправке данных с сенсора используется первый символ '$', а при...

114
Как дополнить запрос Mysql?

Как дополнить запрос Mysql?

Есть запрос как его дополнить?

212