Я пытаюсь получить все данные документов внутри коллекции, но, к сожалению, код извлекает данные только одного документа.
const Charities = ({navigation}) => {
const [userData, setUserData] = useState([]);
{/*fetch all documents from firestore*/}
const fetchData = async()=>{
const querySnapshot = await getDocs(collection(db, "Charities"));
querySnapshot.forEach((doc) => {
console.info(doc.id, " => ", doc.data());
setUserData(doc.data())
});
}
useEffect(() => {
fetchData()
},[])
function renderBody(){
return(
<View
style = {{
// paddingBottom:100,
marginTop:10,
height:300,
alignItems:'center',
justifyContent:'center'
}}>
<Text>{userData?.Name}</Text>
</View>
)
}
}
Между кодом получения документа с официального сайта Firebase, который извлекает информацию только об одном документе, а не обо всех документах. Итак, я хочу, чтобы код извлекал все данные всех документов, чего я и ожидал. Ваша помощь очень ценна.
Похоже, вы вызываете setUserData
один раз для каждого документа в наборе результатов, перезаписывая результат предыдущего вызова. Это то что ты хочешь?
Проблема в том, что возвращается только один документ, и я хочу, чтобы несколько документов возвращались и отображались в виде списка @NicholasTower.
Ваш запрос выглядит правильным для этого. Он вернет все документы в коллекции. Возможно, в этой коллекции только один документ? Скриншот, который вы показали, относится к другой коллекции, поэтому у нас нет возможности узнать об этом. Как упомянул Дуг, ваш код для установки состояния выглядит так, как будто он перезаписывает состояние, но я рад, что вы его отладили и исключили это.
в коллекции есть два документа, как показано на снимке экрана выше, я отредактировал, и код извлекает данные только одного документа, почему? Я не знаю? между кодом в console.info извлекаются данные обоих документов, см. новый снимок экрана
in the console.info the code fetch both documents
Это та информация, которую я искал. Итак: вы получаете несколько документов, но затем переводите в состояние только один из них. Вы получите более быстрые ответы, если включите эти сведения об отладке в свои вопросы.
это решено, спасибо за помощь
Вы регистрируете каждый документ в консоли с помощью forEach, но каждый раз назначаете новый doc.data одному и тому же состоянию. Вместо этого вы можете поместить каждый файл doc.data в массив, а затем обновить состояние всего массива.
const fetchData = async () => {
const querySnapshot = await getDocs(collection(db, "Charities"));
const data = [];
querySnapshot.forEach((doc) => {
console.info(doc.id, " => ", doc.data());
data.push(doc.data());
});
setUserData(data);
};
//or
const fetchData = async () => {
const querySnapshot = await getDocs(collection(db, "Charities"));
querySnapshot.forEach((doc) => {
console.info(doc.id, " => ", doc.data());
setUserData(prevData => [...prevData, doc.data()]);
});
};
К сожалению, у меня пустой экран, данные вообще не отображаются @ 0x74h51N.
Если вы не измените код возврата, вы не сможете отображать какие-либо данные на экране. Вы должны сопоставить состояние своих пользовательских данных следующим образом: userData.map((item, index) => (<Text key = {index}>{item.Name}</Text>))
Круто........ не знаю, как тебя отблагодарить, чувак... всё работает как положено
Проблема в том, что возвращается только один документ, или проблема в том, что вы получаете несколько документов, но в штат помещается только один?