#javascript #reactjs #redux #use-state
#javascript #reactjs #сокращение #use-state
Вопрос:
У меня возникла странная проблема, из-за которой несколько раз значение, передаваемое в useState
, не совпадает с переменной для useState
. Это происходит в одном и том же компоненте пользовательского интерфейса каждый раз, когда у других нет проблемы. Просто хотел дважды проверить, не делаю ли я здесь что-то не так.
// userData is from Redux store
const {userData} = props
const [installed, setInstalled] = useState(userData.installed) // installed: boolean
console.log(userData.installed) // returns true
console.log(installed) // returns false
console.log(userData) // installed: true
Причина, по которой я использую useState, заключается в том, что я использую его для отображения кнопки, которая будет переключена, а также для отображения индикатора, включена она или нет.
<Button onClick={() => setInstalled(!installed) />
Комментарии:
1. Это установило бы только установленный при монтировании, никакие дальнейшие изменения не применялись бы к переменной состояния. Почему вы хотите скопировать значение prop в state?
2. Вероятно, это
installed
изначальноfalse
перед изменением наtrue
, но после инициализацииuseState
игнорирует значение, переданное в качестве аргумента.3. Насколько я помню, useState может обрабатывать асинхронные функции, поэтому он будет обновляться при отправке ответа обратно. В 90% случаев я не вижу никаких проблем, и обычно он отображается правильно, но тот же компонент отображает то, что я показал выше. Также отредактировал OP для контекста.
4. для обработчика щелчков вы должны сделать
() => setInstalled(prevInstalled => !prevInstalled)
Ответ №1:
Я рекомендую использовать useEffect
для просмотра состояния внутри вашего хранилища Redux, а затем обновлять локальное состояние на основе этих изменений :
const [userData] = props ;
const [installed, setInstalled] = useState(userData.installed)
useEffect(() => {
setInstalled(userData.installed)
},[userData])
Комментарии:
1. Это решило проблему. Если я правильно понимаю, useEffect вызывается при монтировании компонента. Затем он обновляет значение
installed
usinguserData
. Это связано с тем, что начальное значение useState может быть неправильным, поскольку это асинхронная функция. Верно?2. он отслеживает изменения пользовательских данных и вызывается при монтировании и при изменении пользовательских данных