Reactjs useEffect挂钩未正确设置状态对象

Reactjs useEffect挂钩未正确设置状态对象,reactjs,firebase,google-cloud-firestore,use-effect,Reactjs,Firebase,Google Cloud Firestore,Use Effect,好吧,我真的不明白为什么会发生这种事。我在不同的组件上做同样的事情,有时有效,有时无效。我使用useEffect钩子从firebase存储中获取对象。我在控制台中正确地获取了对象,但实际上我无法访问任何嵌套值 代码: const ReviewComponent=(道具)=>{ const[open,setOpen]=useState(false) const[campaigns,setCampaigns]=useState([]) 常量[currentCampaign,setCurrentCam

好吧,我真的不明白为什么会发生这种事。我在不同的组件上做同样的事情,有时有效,有时无效。我使用useEffect钩子从firebase存储中获取对象。我在控制台中正确地获取了对象,但实际上我无法访问任何嵌套值

代码:

const ReviewComponent=(道具)=>{
const[open,setOpen]=useState(false)
const[campaigns,setCampaigns]=useState([])
常量[currentCampaign,setCurrentCampaign]=useState([])
//First useEffect钩子用于代码中的其他内容
常量tempDoc=[]
useffect(()=>{
var docRef=数据库收集(“活动”);
docRef.get().then(函数(querySnapshot){
querySnapshot.forEach(函数(doc){
tempDoc.push({id:doc.id,…doc.data()})
//对于查询文档快照,doc.data()从来都不是未定义的
设置活动(临时文档)
});
})
.catch(函数(错误){
log(“获取文档时出错:”,错误);
});
},[]);
//第二个使用效果挂钩(这是导致问题的一个)
useffect(()=>{
const docRef=db.collection(“活动”).doc(slug);
docRef.get().then(函数(doc){
如果(文件存在){
log(“文档数据:”,doc.data());
setCurrentCampaign(doc.data())
}否则{
//在这种情况下,将不定义doc.data()
log(“没有这样的文档!”);
}
}).catch(函数(错误){
log(“获取文档时出错:”,错误);
});
},[]);
const handleOpen=()=>{
setOpen(真)
};
常量handleClose=()=>{
setOpen(假);
};
如果(当前活动[0]){//或如果(活动[0])
console.log(currentCampaign)//这永远不会被记录
}
返回(
{currentCampaign.reviews[0].text}//TypeError:如果我执行currentCampaign.reviews->TypeError,则无法读取未定义的属性'text'
)

正如您所看到的,上图显示了从useEffect钩子中记录的对象。我尝试通过检查currentCampaign[0]是否存在来记录它。它从不存在。如果我使用currentCampaign.body或任何其他顶级元素,它在返回语句中都可以正常工作。如果我执行任何嵌套操作,例如currentCampaign.images[0]。url->错误:

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

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

如果我执行campaign.startDate.seconds,我会得到相同的错误:

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

您不能在
ReviewComponent
component的根级别请求状态值,这意味着状态定义的同一级别。在呈现组件时,最初只调用一次,因此currentCampaign始终为空

您应该在添加状态依赖项的
useffect
中使用它

useEffect(() => {
  if(currentCampaign[0]) {
    console.log(currentCampaign)
  }
}, [currentCampaign]);

返回(
{currentCampaign.reviews[0].text}
关于此错误,currentCampaign最初是空数组,因此在首次呈现此组件时,currentCampaign.reviews将是未定义的。因此,
currentCampaign.reviews[0]。文本将是错误

如果未定义或未定义,则应始终检查当前活动


仅供参考,
currentCampaign
是状态定义中的数组,因此请尝试更正语法以请求
currentCampaign
变量。

如果我检查currentCampaign[0]存在于return语句中,它从不显示我希望它显示的内容,因为currentCampaign始终为空。那么,我如何获取状态中的值呢?只要currentCampaign由
setCurrentCampaign
更新,组件将被重新呈现,因此您将看到currentCampaign值。您已经
setCurrentCampaign
在第二个useEffect中,因此一旦调用成功,currentCampaign将用值填充。什么是
doc.data()
?您确定它是数组吗?这意味着,currentCampaign是对象,您应该更新类型。const[currentCampaign,setCurrentCampaign]=useState({})
if(currentCampaign[0]) { // Or if(campaign[0])
    console.log(currentCampaign) //this never gets logged 
}
useEffect(() => {
  if(currentCampaign[0]) {
    console.log(currentCampaign)
  }
}, [currentCampaign]);
return(
    <Typography>
       {currentCampaign.reviews[0].text}
   </Typography>