Получить только одни данные одного документа вместо всех документов

Я пытаюсь получить все данные документов внутри коллекции, но, к сожалению, код извлекает данные только одного документа.

    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, который извлекает информацию только об одном документе, а не обо всех документах. Итак, я хочу, чтобы код извлекал все данные всех документов, чего я и ожидал. Ваша помощь очень ценна.

Проблема в том, что возвращается только один документ, или проблема в том, что вы получаете несколько документов, но в штат помещается только один?

Nicholas Tower 14.07.2024 21:19

Похоже, вы вызываете setUserData один раз для каждого документа в наборе результатов, перезаписывая результат предыдущего вызова. Это то что ты хочешь?

Doug Stevenson 14.07.2024 21:20

Проблема в том, что возвращается только один документ, и я хочу, чтобы несколько документов возвращались и отображались в виде списка @NicholasTower.

Omar Bakoban 15.07.2024 12:47

Ваш запрос выглядит правильным для этого. Он вернет все документы в коллекции. Возможно, в этой коллекции только один документ? Скриншот, который вы показали, относится к другой коллекции, поэтому у нас нет возможности узнать об этом. Как упомянул Дуг, ваш код для установки состояния выглядит так, как будто он перезаписывает состояние, но я рад, что вы его отладили и исключили это.

Nicholas Tower 15.07.2024 16:00

в коллекции есть два документа, как показано на снимке экрана выше, я отредактировал, и код извлекает данные только одного документа, почему? Я не знаю? между кодом в console.info извлекаются данные обоих документов, см. новый снимок экрана

Omar Bakoban 15.07.2024 16:33
in the console.info the code fetch both documents Это та информация, которую я искал. Итак: вы получаете несколько документов, но затем переводите в состояние только один из них. Вы получите более быстрые ответы, если включите эти сведения об отладке в свои вопросы.
Nicholas Tower 15.07.2024 18:19

это решено, спасибо за помощь

Omar Bakoban 15.07.2024 18:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы регистрируете каждый документ в консоли с помощью 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.

Bashamlan Salem 15.07.2024 17:14

Если вы не измените код возврата, вы не сможете отображать какие-либо данные на экране. Вы должны сопоставить состояние своих пользовательских данных следующим образом: userData.map((item, index) => (<Text key = {index}>{item.Name}</Text>))

0x74h51N 15.07.2024 17:25

Круто........ не знаю, как тебя отблагодарить, чувак... всё работает как положено

Omar Bakoban 15.07.2024 18:14

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