【问题标题】:display firebase data on a flatlist在平面列表上显示 Firebase 数据
【发布时间】:2021-09-01 16:51:11
【问题描述】:

我试图在一个平面列表中显示我在 firebase 上的一堆数据,我现在真的不知道问题出在哪里,我已经尝试过物理填充数组并且它有效,但它没有t 当我从 firebase 获取数据时。我确实看到我在控制台日志中获取了数据,但没有显示出来。

function Squad() {
  const gk = [];

  db.collection('squad').orderBy('position').get().then(snapshot => {
    snapshot.forEach(doc => {
      const playerObject = doc.data();
      gk.push({name: playerObject.name, number: playerObject.number});
      console.log(gk);
    });
  });

  const Item = ({ name, number }) => (
    <View style={styles.item}>
      <Text style={styles.itemText}>{number} - {name}</Text>
    </View>
  );

  const renderItem = ({ item }) => (
    <Item name={item.name} number={item.number} />
  )

  return(
    <View>
      <View style={styles.bar}>
        <Text style={styles.barText}>goalkeeper</Text>
      </View>
      <FlatList 
        data={gk}
        renderItem={renderItem}
        keyExtractor={item => item.id}
      />
    </View>
  )
}

【问题讨论】:

  • 我敢打赌 get() 是异步的。将您的 db 调用置于 useEffect 中,然后在获得结果时重新构建。
  • 我从来没有使用过useEffect,它是如何工作的?
  • useEffect 你将把你的 db 调用放在 useEffect 中,然后在得到结果时触发重建。
  • 我试过用 useEffect 还是不行
  • 告诉我你尝试了什么。

标签: javascript android firebase react-native google-cloud-firestore


【解决方案1】:

您可以在异步函数中获取有关挂载的信息,然后使用钩子将其存储在有状态数组中。

function Squad() {
  const [gk, setGk] = useState([]);

  const getSquad = async () => {
    const ref = db.collection('squad').orderBy('position');
    const doc = await ref.get();
    const playerObject = doc.data();
    const newGk = [...gk, {name: playerObject.name, number: playerObject.number}];
    setGk(newGk);
  }

 useEffect(() => {
  getSquad();
 }, [])

  const Item = ({ name, number }) => (
    <View style={styles.item}>
      <Text style={styles.itemText}>{number} - {name}</Text>
    </View>
  );

  const renderItem = ({ item }) => (
    <Item name={item.name} number={item.number} />
  )

  return(
    <View>
      <View style={styles.bar}>
        <Text style={styles.barText}>goalkeeper</Text>
      </View>
      <FlatList 
        data={gk}
        renderItem={renderItem}
        keyExtractor={item => item.id}
      />
    </View>
  )
}

【讨论】:

    【解决方案2】:

    首先创建一个 useEffect 钩子来充当 componentWillMount 函数,以便在组件准备好时调用该方法。我还包含了 catch 块,以显示可能发生的任何错误。

    import React, { useState, useEffect } from "react";
    
    const Squad = () => {
      const [gk, setGK] = useState([]);
    
      useEffect(() => {
        getSquadData();
      });
    
      const getSquadData = () => {
        db.collection("squad")
          .orderBy("position")
          .get()
          .then((snapshot) => {
            let myData = [];
            snapshot.forEach((doc) => {
              const playerObject = doc.data();
              myData.push({
                id: playerObject.id,
                name: playerObject.name,
                number: playerObject.number,
              });
            });
            setGK(myData);
          })
          .catch((error) => {
            console.log("Error getting data: ", error);
          });
      };
    
      const Item = ({ name, number }) => (
        <View style={styles.item}>
          <Text style={styles.itemText}>
            {number} - {name}
          </Text>
        </View>
      );
    
      const renderItem = ({ item }) => (
        <Item name={item.name} number={item.number} />
      );
    
      return (
        <View>
          <View style={styles.bar}>
            <Text style={styles.barText}>goalkeeper</Text>
          </View>
          <FlatList
            data={gk}
            renderItem={renderItem}
            keyExtractor={(item) => item.id}
          />
        </View>
      );
    };
    
    export default Squad;
    

    因此,如果您在控制台中看到错误日志,请检查您在 Firestore 中的集合,并检查您的 Firestore 中的规则。

    【讨论】:

    • 我认为我的代码现在可以工作,但我现在收到一个错误,提示无法识别平面列表中 keyextractor 中的 item.id。我已经在我的 Firestore 数据中添加了一个 id 字段,我现在也得到了它,但它仍然无法正常工作
    • 好的,所以我现在已经编辑了代码,我们也忘记在 GK 数组中设置 ID (id: playerObject.id)。在将来的参考中,尝试控制台记录数组或其他变量以查看它们的值以便轻松调试。
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多