gpt4 book ai didi

javascript - 在 React 中使用 Map 与 firebase

转载 作者:行者123 更新时间:2023-12-03 01:22:32 25 4
gpt4 key购买 nike

请有人帮忙。我已经梳理了所有文档,检查了所有类似的问题,但确实看不到我错过了什么。

我是 react 新手,并尝试映射从 Firebase 数据库的异步调用返回的文档。

这是代码:

class Posts extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
};
}
componentDidMount() {
let posts = [];
db.collection("Posts").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
posts.push({
data: doc.data(),
id: doc.id
});
});
});
this.setState({
data: posts
});
}
renderPosts() {
console.log(this.state.data);
return this.state.data.map((post, index) => {
console.log(post);
console.log(index);
return (
<div>
{index}
</div>
)
})
}
render() {
return(
<div>
{this.renderPosts()}
</div>
);
}
}

我确信这是非常简单的事情,但我正在抓狂。如果我检查我的状态,我可以看到数据。 console.log(this.state.data); renderPosts 内部甚至准确显示了我需要映射的内容,但 map 回调内的所有内容都不会返回,我最终得到一个空的任何帮助将不胜感激。

最佳答案

正如 Li357 所评论的,setState 调用需要在 get() 回调内部进行:

db.collection("Posts").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
posts.push({
data: doc.data(),
id: doc.id
});
});
this.setState({
data: posts
});
});

原因是数据是从 Firestore 异步加载的,当您调用 setState 时,posts 变量仍然为空。

理解这种类型的异步加载的最简单方法是使用几行日志:

console.log("Before starting to get documents");
db.collection("Posts").get().then(function(querySnapshot) {
console.log("Got documents");
});
console.log("After starting to get documents");

当您运行此命令时,输出为:

Before starting to get documents

After starting to get documents

Got documents

这可能不是您期望的输出顺序。但这是预期的行为:加载数据时不会阻塞代码(这会卡住浏览器),而是 get() 之后的代码.then() block 立即执行。然后,当加载数据时,执行then回调中的代码。这就是为什么所有需要数据库文档的代码都需要位于 then 回调中。

关于javascript - 在 React 中使用 Map 与 firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51700376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com