开发者问题收集

在 React 中映射对象数组时出现错误

2021-08-07
693

我尝试从后端获取数据并在前端显示该数据。这是我编写的用于执行此任务的代码。

function ViewPost() {

    const { id } = useParams();
    console.log(id);

    const [posts, setPosts] = useState({});

    useEffect(()=>{
        getOnePost();
    }, []);

    useEffect(()=>{
        if (posts && posts.location) {
            console.log(posts.location);
            console.log(posts.location.longitude);
            console.log(posts.location.latitude);
        }
    }, [posts]);

    const getOnePost = async () => {
        try {
            const response = await axios.get(`/buyerGetOnePost/${id}`)
            console.log(response);
            const allPost=response.data.onePost;
            setPosts(allPost);
        } catch (error) {
            console.error(`Error: ${error}`)
        }
    }
    console.log(posts);

    console.log(posts.wasteItemList);
    return(
        <div className="posts-b">
            <div className="posts__container-b">
                <h1>Post Details</h1>
                <main className="grid-b">
                    {posts.wasteItemList.map((notes,index)=>(
                    <article>
                        <div className="text-b">
                            <h3>Post ID: {index+1}</h3>
                            <p>Waste Item: Polythene Roll</p>
                            <p>Quantity: 1 kg</p>
                        </div>
                    </article>
                    ))}
                </main>
            </div>
        </div>
    );
}
export default ViewPost;

当我 console.log(posts) 时,它成功显示了帖子数据。wasteItemList 是一个数组,它有两个对象。 帖子内部数据

当我 console.log(posts.wasteItemList) 时,它也成功显示了两个对象数组。 wasteItemList 内部数据

但是当我尝试映射 wasteItemList 时,问题就出现了。我尝试使用此 posts.wasteItemList.map 进行映射。但我收到错误“TypeError:无法读取未定义的属性‘map’”。我该如何解决这个问题?

3个回答

发生这种情况是因为数据不是立即可用的,因此在一段时间内 posts.wasteItemList 未定义。

无论何时访问 wasteItemList ,您都应该使用 posts && posts.wasteItemList && posts.wasteItemList.map(()=> *)

这为您提供了完全的安全性。

如果您使用的是 TypeScript 或节点版本 >= 14,那么您可以使用 可选链posts?.wasteItemList?.map(()=>{}) 这基本上是同一件事,只是在语法上更令人愉悦。

Malik Bagwala
2021-08-07

将此特定行

{posts.wasteItemList.map((notes,index)=>

更改为

{posts.wasteItemList && posts.wasteItemList.map((notes,index)=>
Ayush Gupta
2021-08-07

posts 的初始值为 {}code>,因此帖子上没有 wasteItemList 属性。

尝试访问 posts.wasteItemList 将返回 undefined ,并且您无法映射 undefined

尝试在 posts?.wasteItemList?.map 上使用 可选链接

return(
    <div className="posts-b">
        <div className="posts__container-b">
            <h1>Post Details</h1>
            <main className="grid-b">
                {posts?.wasteItemList?.map((notes,index)=>(
                <article>
                    <div className="text-b">
                        <h3>Post ID: {index+1}</h3>
                        <p>Waste Item: Polythene Roll</p>
                        <p>Quantity: 1 kg</p>
                    </div>
                </article>
                ))}
            </main>
        </div>
    </div>
);

编辑 elegant-jepsen-w7xjt

ksav
2021-08-07