【问题标题】:TypeError: undefined is not an object(evaluating events[0].name)TypeError:未定义不是对象(评估事件[0].name)
【发布时间】:2020-05-31 06:46:03
【问题描述】:

为什么我不能访问我已经在 then 块中设置的状态? events[0].name 是导致此错误的原因。如何将数据传递给我的时间轴组件来处理这种异步性?

  const Finalized = (props) => {
  const [events, setEvents] = React.useState([]);


  React.useEffect(() => {
    firebase
      .database()
      .ref("events/adventure")
      .once("value")
      .then((snapshot) => {
        setEvents(snapshot.val());
        // Not sure why when i console.log(events[0].name) my terminal gets flooded with the output
      });
  });
  let data = [
    {
      time: "09:00",
      title: "Event 1",
      description: <Text>{events[0].name}</Text>,
    },
  ];
  return (
    <View style={styles.container}>
      <Timeline style={styles.list} data={data} />
    </View>
  );
};

【问题讨论】:

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


    【解决方案1】:

    您正在异步设置事件,但尝试访问数据数组中的 events[0].name。 因此,在加载事件之前的初始渲染中,您将收到此错误。

    您可以做的一个修复是有条件地设置描述 描述:{events[0]?.name},

    或仅当事件数组至少有一个元素时才呈现时间轴

      return (
        <View style={styles.container}>
         { events.length===1&& <Timeline style={styles.list} data={data} /> }
        </View>
      );
    

    最好对你的 snapshot.val() 做一个控制台日志,以检查你从 firebase 获得的值。

    【讨论】:

    • 谢谢,您的第二个建议奏效了,但我真的不明白您的第一个建议是什么意思,{events[0]?.name} 您能向我解释一下吗?
    • 如果你在数据数组中设置描述,它将发送一个空描述,第二个实际上是更好的选择:)
    • 发生错误时events数组是否有item?
    • 仅应用第二个建议当我第一次启动应用程序时,我仍然会收到错误消息。结合你的第一个和第二个建议就可以了
    • 哦,好的,最好检查事件数组内容:)
    猜你喜欢
    • 2021-12-17
    • 2021-12-01
    • 2019-11-16
    • 2020-02-09
    • 2019-12-07
    • 2022-01-01
    • 2019-01-20
    • 2014-06-13
    • 2021-07-24
    相关资源
    最近更新 更多