开发者问题收集

将值传递给另一个组件时无法读取未定义的属性(读取“0”)

2022-04-18
110

我编写了以下代码来将值传递给信息框,但我收到错误 未捕获的 TypeError:无法读取未定义的属性(读取“0”)。请告诉我错在哪里。

import React,{useState} from 'react'
function App() {
   const [specificState, setSpecificState] = useState({});
   const jsondata1 = await fetch('https://covid-19-fastest-update.p.rapidapi.com/summary');
    const myData1 = await jsondata1.json();
    const indData = myData1.Countries[77];
   const getdata=()=>{
    const temp =[];
     temp ['Confirmed']= [indData.NewConfirmed, indData.TotalConfirmed]
     temp['Recovered'] = [indData.NewConfirmed, indData.NewConfirmed - indData.TotalDeaths]
     temp ['Deaths']= [indData.TotalDeaths, indData.NewDeaths] 
    setSpecificState(temp);
   }
   useEffect(() => {
    getdata();
   }, [])
   
  return (
    <div> <InfoBox title="Coranavirus cases" cases={ specificState.Confirmed[0] } 
   total={ specificState.Confirmed[1] } />  </div>
  )
}

export default App
3个回答

您需要在 useEffect 内部发出获取请求。

像这样更新您的获取数据函数;

const getdata=()=>{
  const jsondata1 = await fetch('https://covid-19-fastest-update.p.rapidapi.com/summary');
    const myData1 = await jsondata1.json();
    const indData = myData1.Countries[77];
    const temp =[];
     temp ['Confirmed']= [indData.NewConfirmed, indData.TotalConfirmed]
     temp['Recovered'] = [indData.NewConfirmed, indData.NewConfirmed - indData.TotalDeaths]
     temp ['Deaths']= [indData.TotalDeaths, indData.NewDeaths] 
    setSpecificState(temp);
   }

从组件主体中删除获取和其他操作。

然后您需要等待状态被获取,您需要有条件地呈现您的组件。

return (
    <div> {spesificState.Confirmed && <InfoBox title="Coranavirus cases" cases={ specificState.Confirmed[0] } 
   total={ specificState.Confirmed[1] } /> } </div>
  )
}

也许是这样的。

İlker
2022-04-18

当状态最初加载时, specificState 是一个空对象,因此找不到 Confirmed 属性(未定义)

因此在首次渲染时,这将引发此异常。 当 useEffect 运行并检索结果时,将加载此属性,然后您可以使用 InfoBox 类。

因此,请改用

return (
   {specificState.Confirmed ?  <div> <InfoBox title="Coranavirus cases" cases={ specificState.Confirmed[0] } 
   total={ specificState.Confirmed[1] } />  </div> : null }
  )
Apostolos
2022-04-18

您可以在 useEffect 钩子中使用 if 运算符创建语句,因为现在当您尝试使用 indData 时,您获取的数据尚未上传。只需在 useEffect 中覆盖您的 getdata 函数,如下所示:

useEffect(() => {
   if (indData) {
     getdata();
   }
}, [indData])

此外,您需要在 InfoBox 组件中传递案例和总属性时添加额外的值,只需使用 | [] 传递空数组即可

Zorkiy
2022-04-18