开发者问题收集

如何使用 useState 在 Reactjs 中渲染对象数组?

2023-01-20
65

我正在从事一个 mern 项目。我想使用 useState 通过我的数据库在我的 React 页面中呈现一个对象数组。

数据库的结构是 数据库结构

我的代码

import React,{useEffect,useState} from 'react'
import { NavLink,useParams } from 'react-router-dom'
import Adminbar from './Adminbar'

const Contracter = () => {
    const { id } = useParams();
    const [member,setMember] = useState([])

    const tofetchallmember = async ()=>{
        try {
  
            const res = await fetch(`/member/${id}`,{
                method :"GET",
                headers : {
                    Accept : "application/json",
                    "Content-Type" : "application/json"
                },
                credentials : "include"
            })
  
            const data = await res.json()
            setMember(data)
            console.log(data.name);
            console.log(data.projectmembers[0]);
            console.log(data.projectmembers[0].attendance);
            
        } catch (error) {
            console.log(error);         
        }
    }

   

    useEffect(() => {
        tofetchallmember()
    }, [])

    return (
        <>

      
        <Adminbar/>
     
            <div className='container mt-5'>
                <div className='row'>
                    <div className='col-sm-5 col-md-5 col-lg-5'>
                        <div class="row align-items-md-stretch">

                            <div class="h-100 p-5 text-bg-light rounded-3">
                                <h2>Contracter List of {member.name}</h2>
                                <ol class="list-group list-group-numbered mt-5

为了实现这一点,我尝试了上述代码。如果我尝试这样做:

setMember(data)
            console.log(data.name);
            console.log(data.projectmembers[0]);
            console.log(data.projectmembers[0].attendance);

它会完美地显示我控制台中的所有数据,但是当我尝试通过以下方式在我的 html 代码中呈现它时:

<h2>Contracter List of {member.projectmembers[0].name}</h2>

它显示以下错误:

Uncaught TypeError: Cannot read properties of undefined (reading '0')

2个回答

问题是由于在第一次渲染时您的状态 member 是一个空数组,因此当它尝试访问 projectmembers[0].name 时它会崩溃。 您应该使用可选链式 (?.) 运算符来解决实际代码 <h2>Contracter List of {member?.projectmembers[0]?.name}</h2> 或检查数组是否存在:

const Contracter = () => {
  //all the previous code
  return (
   {member.length===0 ? <p>No data</p> : member?.projectmembers[0]?.name}
  )
}
juan ocho
2023-01-20

最初,当组件加载时, member 状态为空数组 [] 。因此,您在该状态中不会有任何数据,您无法访问 member.projectmembers

进行验证以检查 member 对象是否具有 projectmembers ,如下所示。

{ member.projectmembers && member.projectmembers.length > 0 ? <h2>Contracter List of {member.projectmembers[0].name}</h2> : null}
Tmh
2023-01-20