【问题标题】:useEffect to get firebase data not workinguseEffect 获取 Firebase 数据不起作用
【发布时间】:2021-03-15 21:00:55
【问题描述】:

好的,所以我使用 useEffect 来获取 firebase firestore 数据。这是我的钩子代码:

 const [campaign, setCampaigns] = useState([])
useEffect(() => {
    var docRef = db.collection("campaigns").doc(slug);

    docRef.get().then(function(doc) {
      if (doc.exists) {
          console.log("Document data:", doc.data());
              setCampaigns(doc.data()) 
      } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
      }
  }).catch(function(error) {
      console.log("Error getting document:", error);
  });
  },[]);

 console.log(campaign[0].startDate.seconds) // gives the error stated below
 console.log(campaign.images[0].url)// gives the error stated below

响应是:

我可以访问所有顶级属性,例如 body、campaignPolicy 等,但如果我这样做了

TypeError: 无法读取未定义的属性“秒”

如果我做campaign.startDate.seconds 我得到同样的错误:

TypeError: 无法读取未定义的属性“秒”

完整的最小代码:

const ReviewComponent = (props) => {
  const [open, setOpen] = useState(false)
  const [campaigns, setCampaigns] = useState([])
  const [currentCampaign, setCurrentCampaign] = useState([])

//First useEffect hook
  const tempDoc = []
      useEffect(() => {
        var docRef = db.collection("campaigns");
        docRef.get().then(function(querySnapshot) {
          querySnapshot.forEach(function(doc) {
            tempDoc.push({ id: doc.id, ...doc.data() })
              // doc.data() is never undefined for query doc snapshots
              setCampaigns(tempDoc)
          });
      })
      .catch(function(error) {
          console.log("Error getting documents: ", error);
      });
      },[]);


//Second use effect hook
      useEffect(() => {
        const docRef = db.collection("campaigns").doc(slug);
    
        docRef.get().then(function(doc) {
            if (doc.exists) {
                console.log("Document data:", doc.data());
                setCurrentCampaign(doc.data()) 
            } else {
                // doc.data() will be undefined in this case
                console.log("No such document!");
            }
        }).catch(function(error) {
            console.log("Error getting document:", error);
      });
    },[]);


  const handleOpen = () => {
    setOpen(true)
  };

  const handleClose = () => {
    setOpen(false);
  };

  if(currentCampaign[0]) { // Or if(campaign[0])

    console.log(currentCampaign)
  }

  return(
    <Typography>
    {currentCampaign.reviews[0].text}
   </Typography>
)

【问题讨论】:

标签: reactjs firebase google-cloud-firestore react-hooks


【解决方案1】:

您正试图在检索数据之前访问您的数据。这是发生了什么:

// 第一次渲染

  1. 您将状态设置为空数组
  2. 您声明一个带有回调的效果,该回调将在在第一次渲染后调用
  3. 您尝试访问一个确实未定义的值(此时您的数组为空)并且您的应用程序崩溃

// 第二次渲染

您的代码在第一次渲染时崩溃,但如果没有:

  1. 您的状态现在包含您的数据
  2. 你的效果不会被调用,因为你有一个空的依赖数组
  3. 您可以使用您的数据

要使您的代码正常工作,并且每次异步加载数据时都应该这样做,就是检查您的数据是否已加载。

const [campaign, setCampaigns] = useState([]);

useEffect(() => {
    const docRef = db.collection("campaigns").doc(slug);

    docRef.get().then(function(doc) {
        if (doc.exists) {
            console.log("Document data:", doc.data());
            setCampaigns(doc.data()) 
        } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
        }
    }).catch(function(error) {
        console.log("Error getting document:", error);
  });
},[]);

if(campaign.length > 0) { // Or if(campaign[0])
  console.log(campaign[0].startDate.seconds)
  console.log(campaign[0].images[0].url)
}

【讨论】:

  • 即使我想在 return 语句中使用数据,它仍然会抛出相同的错误。只有诸如活动[0].id 或活动[0].couponPrice(它们都是顶级属性)之类的东西有效。任何嵌套的东西,例如campaign[0].images[0].url 都会抛出同样的错误:TypeError: Cannot read property 'url' of undefined
  • 你能创建一个引发错误的最小代码库吗?
  • 好的,我把它添加到我的主帖
  • 你似乎混合了当前campain的类型,有一次它是一个数组,然后是一个对象。检查您需要的类型并坚持使用。而且我没有在您的渲染中看到任何未定义值的检查。
【解决方案2】:

campaign 的默认值是空数组,它是在 Firebase 商店中设置的。 因此,您应该检查广告系列状态什么是空的或有价值的。

if (campaign.length == 0)
    console.log(campaign[0].startDate.seconds);

【讨论】:

  • 我收到此错误:TypeError:无法读取未定义的属性“startDate”。所以说活动未定义,但如果我执行 console.log(campaign) 它会显示整个对象,如我原始帖子中提供的图片所示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多