#javascript #react-native #react-hooks
#javascript #реагировать -родной #реагирующие крючки
Вопрос:
У меня проблема при использовании useState
с reducer.
Я знаю, что useState
у этого есть ограничения, такие как его немедленное обновление, и в моем случае это проблема.
Я извлекаю данные из Firestore и использую useState
их для дальнейшего использования, но при первом нажатии на кнопку, например, я получаю следующую ошибку:
После второго щелчка все данные отображаются идеально.
Есть ли какой-либо способ предотвратить появление этой ошибки?
Запрос Firestore:
const handleService = (bUID) => {
const serviceListTmp = [];
firebase.firestore().collection("users").doc(currentUser.uid).collection("my-appointments").where("businessId", "==", bUID).get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
serviceListTmp.push(doc.data());
})
console.log("Service List TMP =>", serviceListTmp);
setServiceObj(serviceListTmp);
//console.log("Service Obj ", serviceObj);
})
}
Ошибка заключается здесь:
const data = serviceObj.reduce(reducer, []);
Комментарии:
1. Как вы определяете свое состояние для
serviceObj
? Просто случайное предположение, но, вероятно, изначально вы забыли установить[]
это в качестве значения, и именно поэтому вашreduce()
сбой, потому что он может работать только с массивами. Если это так, решение может бытьconst [serviceObj, setServiceObj] = useState([])
.2. const [serviceObj, setServiceObj] = useState();
3. Я дам себе пощечину, если это проблема
Ответ №1:
Основная проблема заключается в том, что вы работаете .reduce()
не с массивом в своем коде. Вероятно, вы забыли изначально установить в своем состоянии значение []
.
Основываясь на разъяснении раздела комментариев, вам необходимо определить свое состояние как:
const [serviceObj, setServiceObj] = useState([])
Кроме этого, ваш код выглядит просто отлично.
Комментарии:
1. Похоже, это работает, я проведу серьезную проверку с большим количеством данных и прокомментирую здесь, если будут какие-либо изменения
2. @OsherRevach Потрясающе, рад помочь!