【问题标题】:How do I get data from firebase realtime databese with React Native?如何使用 React Native 从 firebase 实时数据库中获取数据?
【发布时间】:2020-07-25 13:46:52
【问题描述】:

我正在尝试获取数据 Firebase 实时数据库。我可以用 console.log() 显示数据,但不能在平面列表中显示。我尝试了不同的方法来解决这个问题。但是,我找不到任何确定的解决方案。 在这里,我在 firebase 中的 JSON 树:

这里是我的代码:

const NotesList = (props) => {

  const { colors } = useTheme();
  const styles = customStyles(colors);

  const user = auth().currentUser
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(false);

  const getData = () => {
    firebase.database().ref(`notes/`).on('value', function (snapshot) {
        console.log(snapshot.val())
    });
  }

  useEffect(() => {
    setTimeout(() => {
      setData(getData);
      setLoading(true);
    }, 1000);
  }, []);
  
  const renderItem = ({ item }) => {
    return (
      <View style={{ marginRight: 10, marginLeft: 10 }}>
        <TouchableOpacity>
          <NoteCard title={item.noteTitle} icerik={item.noteDetails} date={item.timestamp} />
        </TouchableOpacity>
      </View>
    );
  };
  const split = () => {
    let icerik = data.map((item, key) => item.icerik);
    return icerik.slice(0, 1) + '...';
  };
  return (
    <View style={styles.container}>
      <StatusBar barStyle="light-content" />
      
      <NoteSearchBar />
      {!loading ? (
        <View style={{ alignItems: 'center' }}>
          <ActivityIndicator color="#ff5227" />
        </View>
      ) : (
          <FlatList
            data={data}
            numColumns={2}
            renderItem={renderItem}
            keyExtractor={(item, index) => index.toString()}
          />
        )}
      <TouchableOpacity
        style={styles.addButton}
        onPress={() => props.navigation.navigate('AddNote')}>
        <Plus width={40} height={40} fill="white" margin={10} />
      </TouchableOpacity>
    </View>
  );
};

我尝试了许多不同的方法,但没有任何建议可以解决问题。如果您能提供帮助,我会很高兴。

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database react-native-firebase


    【解决方案1】:

    您的 getData 不会返回数据,因为数据是异步加载的。相反,您应该将他对setData 的呼叫移动到您的getData

      const getData = () => {
        firebase.database().ref(`notes/`).on('value', function (snapshot) {
          setData(snapshot.val());
        });
      }
    
      useEffect(() => {
        setTimeout(() => {
          getData()
          setLoading(true);
        }, 1000);
      }, []);
    

    现在对 setData 的调用会将 JSON 置于状态,这反过来会强制 React 使用新数据重新绘制 UI。

    【讨论】:

    • 嗨弗兰克,我试过你的建议,但仍然有同样的问题,当我们这样做时,我得到了一个索引范围错误。如前所述,我可以在控制台中看到数据,但无法在列表中显示。
    • 我的答案中的代码都没有访问范围内的任何内容,因此如果您现在收到该错误,则很可能来自您已有的代码。事实上,我希望这是一个好兆头,因为这可能意味着您的渲染代码现在正在使用数据库中的数据调用,而错误来自之前没有被调用的代码。
    【解决方案2】:

    Ciao,基本上你犯了两个错误:

    1. getData 不返回任何内容,因此永远不会使用来自 firebase 的值更新数据;
    2. useEffect 有一个奇怪的实现(这是无用的调用 setTimeout 你已经在等待来自 firebase 的数据);

    我的建议是像这样从useEffect 调用getData

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

    并像这样修改getData

        const getData = () => {
           firebase.database().ref(`notes/`).on('value', function (snapshot) {
              setData(snapshot.val());
              setLoading(true);
           });
        }
    

    【讨论】:

    • 您好 Gio,我尝试了您的建议,但仍然遇到同样的问题,并且在执行此操作时出现索引范围错误。正如我所提到的,我可以在控制台中看到数据,但无法在列表中显示它。这与弗兰克的结果相似。
    • Ciao,我试图在thiscodesendbox 中复制您的NotesList。它几乎相等(NoteSearchBar、NoteCard 和数据除外)。如您所见,FlatList 显示正确的数据。假设 NoteSearchBar 和 data 不是问题,可能 NoteCard 失败了……不知道,你怎么看?
    【解决方案3】:

    我找到了解决方案,我想与你们分享。 我将来自 firebase 的数据作为一个孩子保存在一个新值,然后我将它放入 setData。这样,我就可以在平面列表中显示数据了。

     const getData = () => {
    firebase.database().ref(`notes/`).on('value', snapshot => {
        let responselist = Object.values(snapshot.val())
        setData(responselist)
        console.log(snapshot.val())
        setLoading(true);
    });
    }
    
    useEffect(() => {
      getData();
    }, []);
    

    此外,当 firebase 实时数据库工作时,一种名为 Object 的新方法有助于在 JSON 树中获取子值。

    【讨论】:

    • 正如我在回答中所说,您也可以在 on('value' 的回调中调用 setData。虽然您的原始帖子可能存在多个问题,但当您使用某人的答案来解决您的问题时,通常会承认这一点。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2020-05-29
    • 1970-01-01
    • 2020-09-21
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多