代码之家  ›  专栏  ›  技术社区  ›  yush

ReactJS:无法读取未定义的属性“map”

  •  1
  • yush  · 技术社区  · 5 年前

    我有一个父组件,它获取数据并将其存储到useState中,然后作为道具传递到子组件中。

    当这个子组件被呈现时,我将这个prop数据存储到useState中,然后用map或forEach函数迭代,但是我得到了 cannot read property of undefined errors

    父组件:

    const DisplayOpenIncidents = () => {
      const [data, setData] = useState([]);
      const [loading, setLoading] = useState(true);
    
      useEffect(() => {
        const incidents = FetchIncidents();
    
        incidents.then((incidents) => {
          setData(incidents);
          setLoading(false);
        });
      }, []);
    
      return (
        <AccordionExample data={data} />
      );
    };
    

    子组件:

    const AccordionExample = (props) => {
      const [test, setTest] = useState(props.data);
    
      useEffect(() => {
        console.log(props.data); // Displays array
        setTest(props.data);
      }, [props]);
    
      return (
        <Accordion defaultActiveKey="0">
          <Card>
            <Accordion.Toggle as={Card.Header} eventKey="0">
              TITLE
            </Accordion.Toggle>
            <Accordion.Collapse eventKey="0">
              <Card.Body>
                {test.forEach((test) => {
                  console.log(test);
                })}
              </Card.Body>
            </Accordion.Collapse>
          </Card>
        </Accordion>
      );
    };
    

    短暂性脑缺血发作

    4 回复  |  直到 5 年前
        1
  •  1
  •   Deepu Reghunath    5 年前

    使用以下条件

    <Accordion.Collapse eventKey="0">
          <Card.Body>
            {test && test.forEach((test) => {
              console.log(test);
            })}
          </Card.Body>
        </Accordion.Collapse>
    
        2
  •  1
  •   Paul Martin    5 年前

    我试着用一些数字来重现这一切。我看到的问题是。。。

    1. DisplayOpenIncidents AccordionExample 未呈现组件。
    2. 你的 forEach 函数不返回任何内容,因此组件不会呈现。跑步 map 会解决这个问题的。

    下面是使用替代错误数组的代码。。。

    import React, { useState, useEffect } from "react"
    
    const AccordionExample = (props) => {
    
      return (
        <div defaultActiveKey="0">
          <div>
            <div eventKey="0">
              TITLE
            </div>
            <div eventKey="0">
              <div>
                {props.data.map((test) => <p>{test}</p>)}
              </div>
            </div>
          </div>
        </div>
      );
    };
    
    const App = () => {
      const [data, setData] = useState([]);
    
    useEffect(() => {
      const incidents = [1, 2, 3]
    
      //incidents.then((incidents) => {
        setData(incidents);
        //setLoading(false);
      //});
    }, []);
    
    return (<AccordionExample data={data} />);
    }
    
    
    export default App
    
        3
  •  1
  •   Prakash Jethava    5 年前

    测试 像吼叫一样的物体

    <Accordion.Collapse eventKey="0">
          <Card.Body>
            {test ? test.forEach((test) => {
              console.log(test);
            }) : "Error"}
          </Card.Body>
    </Accordion.Collapse>
    
        4
  •  0
  •   Atom    5 年前

    我相信您正在尝试console.log在JSX中,但做不到这一点,它将显示错误。

    试试这个。

    <Card.Body>
       {test.map((test) => ( 
             <h1 key={test.id}>{test.name} </h1>
       ))}
    </Card.Body>