Я создаю несколько приложений в react
, последним является панель администратора, поэтому мое приложение react
должно иметь аутентификацию, абсолютно все мои продукты использовали Server Side Rendering
.
В последнем случае серверная команда использует pass me Token
для обработки авторизации, это технологии Java
, Spring
, Redis
и т. Д. Base.
Когда я отправляю username
и password
на их сервер, если информация верна, они отправляют мне token
и что-то еще, я сохраняю ее в localStorage
и меняю корень state
из react
приложение в качестве логина, из-за этого изменения приложения используют другой routing
.
Все выглядит хорошо, но что происходит, когда я обновляю страницу? здесь проблема возникнет, login
state
равно false
, поэтому приложение переходит на страницу входа в систему, в componentDidMount
я прочитал localStorage
и выяснил О-о! Я получил токен раньше и приложение вошло в систему, поэтому измените login
state
на true
.
ЗДЕСЬ , мерцание происходит, и я не знаю, как я могу предотвратить это плохое событие.
Мой корень state
, как показано ниже:
class App extends Component {
constructor() {
super();
this.state = { //the root state
login: false,
};
};
...
componentDidMount
как показано ниже:
componentDidMount() {
this.loginStateHandler(!!JSON.parse(localStorage.getItem('accessToken')));
};
loginStateHandler = (login) => {
if (!login) {
localStorage.clear();
}
this.setState({
login,
});
};
А переключение между маршрутом входа в систему и маршрутом приложения выполняется в render
функции корневого компонента с именем App
, см. Код ниже:
{
this.state.login
? (
<div className={styles['app-wrapper']}>
<div className={styles['app-wrapper__top']}>
<Button classes={{root: this.props.classes.exitButton}} onClick={this.logoutHandler}>
exit
</Button>
</div>
<AppRoutes key='appRoutes' fetchManager={this.fetchManager}/>
</div>
)
: (
<LoginRoutes loginHandler={this.loginHandler}/>
)
}
Как я могу написать аутентификацию, которая предотвращает это мерцание. Я хочу, чтобы приложение решило, что пользователь вошел в систему или нет перед первым рендерингом. это возможно?