Задать вопрос
Kentavr16
@Kentavr16
long cold winter

Как заставить реакт правильно обновить компоненты?

На странице входа сайта я использовал код
useEffect(() => {
    if (token) {
      navigate("../cabinet", { replace: true });
    }
  });

Токен хранится в localstorage.
Работает, но есть проблема - в компоненте с навигацией
{token ? (
        <button className="signout" onClick={deleteToken}>Выйти</button>
      ) : (
        <nav>
          <Link to="/registration">регистрация</Link>
          <Link to="/signin">вход</Link>
        </nav>


То есть: при входе перенаправляет в кабинет, но компонент с навигацией все та же содержит линки на регистрацию/вход. Кнопка выхода появляется если перезагрузить страницу.
Как правильно и красиво поправить ситуацию?
  • Вопрос задан
  • 64 просмотра
Подписаться 1 Простой 6 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Решения вопроса 1
Kentavr16
@Kentavr16 Автор вопроса
long cold winter
вытяжка из комментария -
Best practice - спрятать токен в httpOnly куке, чтоб js не мог его прочесть и авторизовываться просто через куку в хеадере запроса.
Можно вот тут почитать, к примеру https://habr.com/ru/company/ruvds/blog/512866/ (обратите внимание на комментарии)
В любом случае Вам необходимо завести через реакт контекст (к примеру) стор, доступный в любом месте приложения. Оборачиваете всё приложение в контекст провайдер, на первой странице (или при загрузке приложения) запрашиваете какие-либо данные с бэка (данные пользователя например, если авторизация через куку, либо получаете jwt-токен в ответ на ввод логина) сохраняете в переменную в контексте (isAuth например), а в целевом компоненте навигации используете эту переменную как условие выводить одно или другое. Можно вызывать useEffect(() => {какой-то код},[имя переменной]), который будет дергаться только когда "имя переменной" обновится...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽