ReactJS -> Почему мое состояние возвращается неопределенным с первой попытки?

Я пытаюсь сохранить состояние входа в систему пользователя в состоянии, а затем отправить его в файл cookie. Дело в том, что в первый раз, когда я вхожу в систему через форму входа, я устанавливаю для параметра loginState значение «вошел в систему», затем я записываю его в консоль, но он возвращает undefined, а затем при втором нажатии кнопки входа в систему (после того, как я уже вошел в систему успешно), наконец, в консоли появляется сообщение «выполнен вход». Почему это? Как это исправить? Вот соответствующий код:

    const [loginStatus, setLoginStatus]= useState()
    //Here we have irrelevant code that validates the login info entered and then it calls authorizeUser
    const authorizeUser=()=>{
      setLoginStatus('logged in')
      console.info(loginStatus)
}

Он асинхронный и не обновляется сразу после установки состояния.

Ryuko 23.12.2020 15:29

В дополнение к приведенному выше комментарию вы можете использовать хук useEffect для регистрации обновленного состояния: useEffect(() => { console.info(loginStatus); }, [loginStatus]);

Yousaf 23.12.2020 15:30

@Кроме того, хоть он и не заходит в консоль, после нажатия кнопки он все равно устанавливается, хоть и не показывает сразу?

Python_Mython79 23.12.2020 15:30

@Python_Mython79 да. Он не будет отображаться в вашем компоненте до следующего повторного рендеринга. React пакетно обновляет состояние для повышения производительности.

Jared Smith 23.12.2020 15:31
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

useEffect запускается после каждого рендера, поэтому даже если вы устанавливаете значение loginStatus в useEffect(), при первом рендеринге loginStatus не будет иметь значения. Вы можете установить значение по умолчанию перед первым рендерингом, передав значение по умолчанию в своем вызове useState(), например:

const [loginStatus, setLoginStatus] = useState('whatever you want here, even a null string')

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