React:使用 axios 将 api 数据传递给子组件时,如何解决未定义的问题?

React: How do I fix getting undefined when passing api data to child component using axios?

我在访问传递给子组件的数据时遇到问题。这可能与 Promise 在访问它时未被解决有关,但这是我不知道如何解决的问题。我需要的是确保从父组件中完全检索数据,然后传递给子组件 ApplicationStats。

这是我为父组件写的代码:

import axios from 'axios';
import ApplicationStats from './ApplicationStats';

const Apps = () => {
  const [apiData, setApiData] = useState([]);
  const ifaUrl= 'url1';
  const orgUrl = 'url2';

  const fetchData = () => {
    const ifaResponse = axios.get(ifaUrl);
    const orgResponse = axios.get(orgUrl);
    axios.all([ifaReq, orgReq]).then(
      axios.spread((...responses) => {
        setApiData({
          ifaResult: responses[0];
          orgResult: responses[1];
        });
      }),
    );
  };

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

  return (
    <div className="card-deck"
      <ApplicationStats apiData={apiData} />
    </div>
  );
};

这是子组件:

import React from 'react';

const ApplicationStats = ({apiData}) => {
  const {ifaResult, orgResult} = apiData;
  console.log(ifaResult.data);

  return (
    <div>Hey</div>
  );
};

在子组件中,如果我将 console.log(ifaResult.data) 替换为 console.log(ifaResult),我得到这个未定义的,然后我得到数据。

我想做的是将我的 console.log(ifaResult.data) 保留在子组件中,但我得到了这个

我什至尝试过使用 async/await,但我觉得我遗漏了一些重要的东西。

apiData 的初始值是一个空数组。

当 Ajax 响应到达时,您将其替换为具有 ifaResult 属性.

的对象

…但是到那时你已经使用初始数据渲染了组件并得到了错误。

————

当您为状态设置初始数据时,使其与您打算稍后放入其中的数据的形状相同。

问题是您将 apiData 初始化为一个数组,而不是一个对象。这是问题,已证明:

let x = [];
const { property } = x; // property === undefined!
console.log(property.data) // ERROR! Cannot find property `data` of undefined

这个中断的原因是因为当 Javascript 检查对象的 属性 不存在时,它 returns 未定义。但是,当您从 undefined 中检查 属性 时,JavaScript 将引发错误。

这将防止您收到错误,并将 undefined 记录到控制台而不是中断:

const [apiData, setApiData] = useState({ ifaResult: {}, orgResult: {}});

另一个人为的例子:

const x = undefined;
x.data // ERROR!

//...

const x = {}
x.data // undefined