我试图使用"。map()"映射文件,我要重火力点。然而,它说.map()不是一个函数。代码如下。基本上,我试图获取我的firebase数据,然后渲染每个文档作为一个元素。
<div{posts.map((doc) => <p>{doc.data().text}</p>)}</div>
如何声明useState posts变量:
const [posts, setPosts] = useState([]);
如何设置useState posts变量
useEffect(() => {
db.collection('posts').onSnapshot((querySnapshot) => {
setPosts(querySnapshot);
});
})
我也试过使用". foreach "。我可以"console。log"使用".forEach"但".forEach"不允许返回元素.
.forEach
可以在Sets, Maps
和Arrays
上使用,而.map
只能在数组上使用。因此,querySnapshot
很可能返回一个在posts
上更新的集合,因为posts
现在是Set
,map
无法迭代并返回可迭代posts
的值。为了克服这个问题,可以在更新状态之前将Set转换为数组。
useEffect(() => {
db.collection('posts').onSnapshot((querySnapshot) => {
let querySnapshotToArray = Array.from(querySnapshot)
setPosts(querySnapshotToArray);
});
})
现在post
是一个数组,您可以对其进行映射并返回所需的值。
当react组件第一次渲染posts=null
或undefined
,所以.map
是undefined你需要使用可选链接,在JavaScript中由?.
表示,这是ES2020中引入的新功能。
<div{posts?.map((doc) => <p>{doc?.data()?.text}</p>)}</div>
首先记录你的querySnapshot,看看它是否是一个数组,然后你应该检查如果posts'数组不是空的。试试这个:
<div{posts.length > 0 ? posts.map((doc) => <p>{doc.data().text}</p>) : null}</div>