#reactjs #use-state
Вопрос:
Я пытаюсь обновить массив объектов, но даже если функции передаются правильные значения, массив остается пустым. Если я попытаюсь добавить второй объект, то каким-то образом будет добавлен первый, и я не уверен, что делаю неправильно.
const [qualifications, setQualifications] = useState([{}]);
function handleAddQualification(values: any) {
console.log(values);
console.log(qualifications);
setQualifications((prev) => {
return [...prev, values];
});
console.log(qualifications);
}
Значения, которые я передаю, регистрируются правильно, и 2 последующих журнала квалификаций показывают пустой массив объектов.
Я упростил объект, поэтому на снимке экрана я добавил «один», и значение регистрируется правильно, но массив квалификаций остается пустым. Если я добавлю вторую запись «два», то по какой-то причине она добавит «один» в массив.
Пожалуйста, поделитесь некоторым пониманием того, что здесь происходит?
Комментарии:
1. setState не будет обновляться немедленно. каков здесь пример использования? можете ли вы включить еще какой-нибудь код?
2. Можете ли вы упомянуть здесь окончательное ожидаемое состояние? Кроме того, как упоминал Сарун, немедленное ведение журнала после изменения состояния не приведет к печати правильных значений
Ответ №1:
Вот пример того, как работает цикл событий 🙂
В вашем случае:
- Зовущий
handleAddQualification
- Лог
values
,qualifications
- Добавление
setQualifications
в очередь как асинхронная операция - Войдите
qualifications
снова с тем же результатом, что и на шаге 3 - Здесь могут выполняться задачи из очереди, которая была добавлена ранее
setQualifications
setQualifications
Обновленияqualifications
Взгляните сюда для лучшего понимания https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
Ответ №2:
Вызовы обновления состояния являются асинхронными, и вы не можете увидеть их, войдя в систему сразу после вызова обновления.
- Первый объект пуст, потому что вы определили его в состоянии по умолчанию, и вы обновляете свое новое состояние, используя предыдущее состояние, из-за этого пустой объект всегда остается первым элементом в массиве. Чтобы исправить это
qualifications
, установите свой
interface Qual {
subject?: string;
level?: string;
other?: string
}
const [qualifications, setQualifications] = useState<Qual[]>([]);
- если вы хотите регистрировать состояние всякий раз, когда оно обновляется, используйте крюк эффекта, что-то вроде этого
useEffect(() => {
console.log({qualifications});
}, [qualifications])
Комментарии:
1. Спасибо за это 🙂
2. Если я инициализирую массив как пустой, то я получаю ошибку машинописного текста «Аргумент типа» (до: никогда[]) => любой [] «не может быть присвоен параметру типа» SetStateAction><никогда[]>». Тип ‘(предыдущее: никогда[]) => любой[]’ не может быть присвоен типу ‘(Предыдущее состояние: никогда[]) =>> никогда[]’. Тип «любой []» не может быть присвоен типу » никогда []».’
3. Это все исправило! Еще раз спасибо за вашу помощь. const [квалификация, набор квалификаций] = useState<объект[]>([]);
4. Я обновил код в соответствии с вашим вариантом использования, но вы можете изменить интерфейс по своему усмотрению