Проблема синхронизации в React.js для отображения содержимого из API Express.js

У меня проблема со временем в React.js

У меня есть компонент, который проверяет действительность пользователя. Токен и тип пользователя, а если он является администратором, отображают содержимое, а если нет, то «у вас нет разрешения».

Но когда пользователь является администратором, сначала компонент показывает «у вас нет разрешения» и сразу отображает содержимое.

Я думаю, что это асинхронная проблема, потому что требуется некоторое время, чтобы получить тип пользователя из бэкэнда, как это исправить в React.js

Мой компонент выглядит так:

export default function Component() {
  useEffect(() => {
    axios
      .post(`http://${process.env.REACT_APP_RUN}:3001/api/token/status`, {
        token,
      })
      .then((response) => {
        setvalidtoken(response.data);
      });
  }, []);

  if (!token || validtoken.valid === "false") {
    window.location.replace(`http://${process.env.REACT_APP_RUN}:3000/login`);
  } else if (validtoken.type !== "admin") {
    return (
      <>
        <Navbar />
        <div className = "premission-denied-holder">
          <div className = "premission-denied-ithed">
            <h6 className = "text-premisson">you dont have premission</h6>
          </div>
        </div>
      </>
    );
  } else {
    return <h1>some content here</h1>;
  }
}

Я попытался изменить последовательность

Если вы не используете загрузчик, используйте его до тех пор, пока ваш API не станет успешным, чтобы ваш загрузчик был виден в месте «у вас нет разрешения».

Manik Kumar 20.04.2023 11:54

Вы можете добавить компонент, показывающий «загружается» во время запроса API.

Hao-Jung Hsieh 20.04.2023 12:05
Поведение ключевого слова "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) для оценки ваших знаний,...
2
2
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я предлагаю вам добавить состояние isloading:

export default function Component() {
  const [isLoading,SetIsLoading] = useState(false);

  useEffect(() => {
    SetIsLoading(false)
    axios
      .post(`http://${process.env.REACT_APP_RUN}:3001/api/token/status`, {
        token,
      })
      .then((response) => {
        setvalidtoken(response.data);
        setIsLoading(true)
      });
  }, []);
if (isLoading){
  if (!token || validtoken.valid === "false") {
    window.location.replace(`http://${process.env.REACT_APP_RUN}:3000/login`);
  } else if (validtoken.type !== "admin") {
    return (
      <>
        <Navbar />
        <div className = "premission-denied-holder">
          <div className = "premission-denied-ithed">
            <h6 className = "text-premisson">you dont have premission</h6>
          </div>
        </div>
      </>
    );
  } else {
    return <h1>some content here</h1>;
  }
}
}

Вам нужно отслеживать, завершен ли запрос API или нет. Вы можете либо добавить новую часть состояния с именем что-то вроде isLoading, которое по умолчанию равно true и устанавливается на false, когда вызов API завершается, и использовать его для отображения заполнителя загрузки, или вы можете просто вернуться раньше, если validtoken еще не установлено ( предполагая, что он не определен, пока не будет установлен в вызове API).

if (!validtoken) return <p>Loading...</p>

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