How to access the values of a nested object in an array, it keeps saying Uncaught TypeError: Cannot read properties of undefined
How to access the values of a nested object in an array, it keeps saying Uncaught TypeError: Cannot read properties of undefined
我正在尝试访问数组中嵌套对象的值,我正在从 API 获取数据。当我尝试将数据记录到控制台时,它总是只显示此错误,“未捕获的 TypeError 无法读取 属性”
这是代码..
export const ItemPage = () => {
const {id} = useParams();
const url = `http://localhost:8000/details/${id}`
const [data, setData] = useState({});
useEffect(() => {
console.log("page just loaded")
getData();
}, []);
const getData = async() => {
await axios.get(url)
.then((res)=> {
setData(res.data);
})
.catch((err) => console.log(err));
}
const newData = data.breeds;
return (
<div className='py-4 space-y-12'>
<div className=' w-screen h-fit grid lg:flex md:flex justify-around px-12'>
<div >
<img className='w-72 h-56 rounded-2xl' src={data.url} alt="" />
</div>
<div className=' w-full lg:w-1/2 md:w-1/2 px-4 space-y-2 pt-6 lg:pt-0 '>
<p className='text-xl'><strong>{newData[0].name}</strong></p>
<p className='text-xs lg:text-sm'>{newData[0].description}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Temperament</b>: {newData[0].temperament}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Origin</b>: {newData[0].origin}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Life Span</b>: {newData[0].life_span}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Affection level:</b>{newData[0].affection_level}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Child Friendly:</b>{newData[0].child_friendly}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Grooming:</b>{newData[0].grooming}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Intelligence:</b>{newData[0].intelligence}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Health Issue:</b>{newData[0].health_issue}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Social Needs:</b>{newData[0].social_needs}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Stranger friendly:</b>{newData[0].stranger_friendly}</p>
</div>
</div>
</div>
)
}
您试图在实际加载数据之前在模板中呈现数据,因此访问任何 属性 newData 都会引发错误;
getData 在模板呈现后触发,但在呈现期间访问 newData;
您没有以正确的方式处理异步加载的数据;一个可能的解决方案是使用内部状态:
const [newData, setNewData] = useState({});
useEffect(() => {
getData()
.then(data =>
setNewData(data)
);
}, [])
然后在您的模板中您可以正确使用 newData
除此之外你需要考虑到你的状态变量被初始化为一个空对象(传递给 useState
的参数)所以在你的模板中你可以安全地做 {newData.aaa}因为 newData 是 {} 并且 newData.aaa 是未定义的,但不是 {newData.bbb.ccc} 因为它会抛出 (newData.bbb = undefined and cannot read 属性 ccc of undefined);为此,您应该为子对象定义一个状态变量,例如 const [subBBB, setSubBBB] = useState({})
useEffect(() => {
getData()
.then(data =>
setNewData(data)
setSubBBB(data.bbb)
);
}, [])
现在可以安全访问 {subBBB.ccc}
这显然只是一个可能的解决方案,另一个是将状态初始化为 {bbb: undefined}...
我正在尝试访问数组中嵌套对象的值,我正在从 API 获取数据。当我尝试将数据记录到控制台时,它总是只显示此错误,“未捕获的 TypeError 无法读取 属性”
这是代码..
export const ItemPage = () => {
const {id} = useParams();
const url = `http://localhost:8000/details/${id}`
const [data, setData] = useState({});
useEffect(() => {
console.log("page just loaded")
getData();
}, []);
const getData = async() => {
await axios.get(url)
.then((res)=> {
setData(res.data);
})
.catch((err) => console.log(err));
}
const newData = data.breeds;
return (
<div className='py-4 space-y-12'>
<div className=' w-screen h-fit grid lg:flex md:flex justify-around px-12'>
<div >
<img className='w-72 h-56 rounded-2xl' src={data.url} alt="" />
</div>
<div className=' w-full lg:w-1/2 md:w-1/2 px-4 space-y-2 pt-6 lg:pt-0 '>
<p className='text-xl'><strong>{newData[0].name}</strong></p>
<p className='text-xs lg:text-sm'>{newData[0].description}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Temperament</b>: {newData[0].temperament}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Origin</b>: {newData[0].origin}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Life Span</b>: {newData[0].life_span}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Affection level:</b>{newData[0].affection_level}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Child Friendly:</b>{newData[0].child_friendly}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Grooming:</b>{newData[0].grooming}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Intelligence:</b>{newData[0].intelligence}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Health Issue:</b>{newData[0].health_issue}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Social Needs:</b>{newData[0].social_needs}</p>
<p className='text-xs lg:text-sm md:text-sm'><b>Stranger friendly:</b>{newData[0].stranger_friendly}</p>
</div>
</div>
</div>
)
}
您试图在实际加载数据之前在模板中呈现数据,因此访问任何 属性 newData 都会引发错误; getData 在模板呈现后触发,但在呈现期间访问 newData; 您没有以正确的方式处理异步加载的数据;一个可能的解决方案是使用内部状态:
const [newData, setNewData] = useState({});
useEffect(() => {
getData()
.then(data =>
setNewData(data)
);
}, [])
然后在您的模板中您可以正确使用 newData
除此之外你需要考虑到你的状态变量被初始化为一个空对象(传递给 useState
的参数)所以在你的模板中你可以安全地做 {newData.aaa}因为 newData 是 {} 并且 newData.aaa 是未定义的,但不是 {newData.bbb.ccc} 因为它会抛出 (newData.bbb = undefined and cannot read 属性 ccc of undefined);为此,您应该为子对象定义一个状态变量,例如 const [subBBB, setSubBBB] = useState({})
useEffect(() => {
getData()
.then(data =>
setNewData(data)
setSubBBB(data.bbb)
);
}, [])
现在可以安全访问 {subBBB.ccc} 这显然只是一个可能的解决方案,另一个是将状态初始化为 {bbb: undefined}...