我在一个网站上工作,学习Reaction和Firebase.我能够从Firebase拉取数据并使用 map 显示在页面上,并 for each 元素返回一个div,但我希望拉出的所有信息都显示在我为它们创建的组件中,以便与页面的其余部分具有一致的样式.

当try 循环访问posts数组时,我收到错误消息Cannot read properties of undefined (reading 'id'),但当我console.log数组时,所有对象都正确显示.有没有按索引访问数组的方法,或者我做错了吗?

以下是MRE:

import React, { useState, useEffect } from 'react'
import { TrendBar, TrendCard } from '../components'
import { db } from '../firebase'
import { collection, getDocs } from 'firebase/firestore'

const Home = () => {
    const [posts, setPosts] = useState([]);
    const collectionRef = collection(db, 'posts');

    useEffect(() => {
        const getPosts = async () => {
            const data = await getDocs(collectionRef)
            setPosts(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })))
        }
        getPosts()
    }, [])

    return (

        <>
        {/* displays all elements of the db on the page  */}
        {posts.map((post) => {
            return <div>
                <h1>{post.title}</h1>
            </div>
        })}

        {/* Would like to display the elements like this */}
            <TrendBar
                firstTrend={
                    <TrendCard
                        id={posts[0].id}
                        image={posts[0].image}
                        imageAlt={posts[0].imageAlt}
                        title={posts[0].title}
                        tags={posts[0].tags}
                    />
                  }
                secondTrend={
                    <TrendCard
                        id={posts[1].id}
                        image={posts[1].image}
                        imageAlt={posts[1].imageAlt}
                        title={posts[1].title}
                        tags={posts[1].tags}
                    />
                 }
            />
        </>
    )
}

谢谢

推荐答案

在绘制数组之前,需要判断数组长度!==0. 有几种方法可以判断它,最简单的一种是:

posts.length && posts.map((post) => {
                return <div>
                    <h1>{post.title}</h1>
                </div>
            })}

posts?.map((post) => {
            return <div>
                <h1>{post.title}</h1>
            </div>
        })}

此外,为了防止将来出现错误,我们采用了新的语法:

<TrendBar
            firstTrend={
                <TrendCard
                    **id={posts?.[0].id}**
                    image={posts[0].image}
                    imageAlt={posts[0].imageAlt}
                    title={posts[0].title}
                    tags={posts[0].tags}
                />

可选调用,可以通过这种方式调用事件函数func?.().

您需要执行这些判断,因为数据是异步到来的,因此在下载数组之前无法获取array[n]elem.

如果你有更多的问题,请不要犹豫,尽管问.

Javascript相关问答推荐

try 在addEventHandler内设置表单的文件输入.值=空

使用useup时,React-Redux无法找到Redux上下文值

类型脚本中只有字符串或数字键而不是符号键的对象

为什么ngModel不能在最后一个版本的Angular 17上工作?'

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

v—自动完成不显示 Select 列表中的所有项目

如何从html元素创建树 struct ?

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

使用Java脚本导入gltf场景并创建边界框

如何在文本字段中输入变量?

如何迭代叔父元素的子HTML元素

对路由DOM嵌套路由作出react

用于在路径之间移动图像的查询

环境值在.js文件/Next.js中不起作用

VSCode中出现随机行

使用类型:assets资源 /资源&时,webpack的配置对象&无效

在D3条形图中对具有相同X值的多条记录进行分组

在不扭曲纹理的情况下在顶点着色器中旋转UV

如何修复使用axios运行TSC index.ts时出现的错误?