javascript - TypeError:无法读取属性“标题”和未定义 React Hooks 道具的映射问题
问题描述
我有一个要获取的 Json 文件。我获取了数据,可以从 App.js 获取控制台中的数据。但是当我将数据作为道具传递给我的子组件时,它给了我一个空数组并且不显示项目。这里可能是什么错误?我的 json 数据和组件如下
App.js
import React, { useEffect, useState } from "react";
import logo from "./logo.svg";
import "./App.css";
import ProcessContainer from "./components/AdoptionProcess/ProcessContainer";
function App() {
const [adoptionProcess, setAdoptionProcess] = useState([])
async function fetchAsync () {
let response = await fetch('./data.json');
let data = await response.json();
return data;
}
fetchAsync()
.then(data => setAdoptionProcess(data))
useEffect(() => {
fetchAsync()
},[])
return (
<div className="App">
<ProcessContainer adoptionProcess={adoptionProcess}/>
</div>
);
}
export default App;
ProcessContainer.js
import React, { useEffect, useState } from "react";
import ProcessItems from "./ProcessItems";
import { Container, Row, Col } from "react-bootstrap";
import 'bootstrap/dist/css/bootstrap.min.css';
const ProcessContainer = ({adoptionProcess}) => {
console.log(adoptionProcess) // -> gives and empty array here
return (
<Container>
<Row className="adoptionContainer py-5">
<Col sm={12}>
<h1>{adoptionProcess && adoptionProcess.adoptionProcessTitle.title}</h1>
<Row className="mt-5 items">
{adoptionProcess && adoptionProcess.adoptionProcessItems.map((process) => (
<ProcessItems
img={process.img}
text={process.text}
firstDescription={process.firstDescription}
secondDescription={process.secondDescription}
/>
))}
</Row>
</Col>
</Row>
</Container>
);
};
export default ProcessContainer;
ProcessItems.js
import React from "react";
import { Col } from "react-bootstrap";
import "./AdoptionProcess.css";
const ProcessItems = ({
img,
text,
firstDescription,
secondDescription
}) => {
return (
<Col lg={4} className="mb-5">
<img src={img} alt="img" className="mb-3" />
<p>{text}</p>
<span>{firstDescription}</span> <br />
<span>{secondDescription}</span>
</Col>
);
};
export default ProcessItems;
data.json
{
"adoptionProcessItems": [
{
"id": 1,
"img": "https://i.pinimg.com/736x/2e/23/d3/2e23d3827c8293c27cea544a8acbcd59.jpg",
"text": "Find Your Pet",
"firstDescription": "Lorem Ipsum Lorem Ipsum Lorem",
"secondDescription": "Lorem Ipsum Lorem Ipsum Lorem"
},
{
"id": 2,
"img": "https://i.pinimg.com/736x/5f/80/85/5f80854fd1475958717a19e345695942.jpg",
"text": "Find Your Pet",
"firstDescription": "Lorem Ipsum Lorem Ipsum Lorem",
"secondDescription": "Lorem Ipsum Lorem Ipsum Lorem"
},
{
"id": 3,
"img": "https://i.pinimg.com/736x/2e/23/d3/2e23d3827c8293c27cea544a8acbcd59.jpg",
"text": "Find Your Pet",
"firstDescription": "Lorem Ipsum Lorem Ipsum Lorem",
"secondDescription": "Lorem Ipsum Lorem Ipsum Lorem"
}
],
"adoptionProcessTitle" : {
"title" : "Pet Adoption Process"
}
}
解决方案
如果你的fetchAsync
函数不依赖于组件内部的任何东西,我会在组件外部定义它,这样就不会在每次渲染时创建新的引用。然后,确保在钩子内调用它。useEffect
编辑:您遇到的另一个问题是您试图在 JSON 对象存在之前访问其属性(即,在获取数据之前)。我建议不要为您的收养对象设置初始值,并在未定义时显示某种加载指示器。见下文:
async function fetchAsync () {
let response = await fetch('./data.json');
let data = await response.json();
return data;
}
function App() {
const [adoptionProcess, setAdoptionProcess] = useState()
useEffect(() => {
fetchAsync()
.then(data => setAdoptionProcess(data))
},[])
if (!adoptionProcess) {
return <div>Loading...</div>
}
return (
<div className="App">
<ProcessContainer adoptionProcess={adoptionProcess}/>
</div>
);
}
推荐阅读
- mysql - SQL 查询为我提供了每天无法运行游戏的用户百分比
- javascript - 如何在 JS 或 CSS 中使用 svg 作为鼠标光标?
- python - 解析python文件时如何从某些函数中检索完全限定名称
- javascript - 无法将 html 表数据绑定到 mvc 控制器模型
- javascript - 基于数组中某项的数组的结构顺序将某个值设置为true
- cloud - Velodyne 激光雷达实时解码
- c++ - 如何在 Minecraft 服务器上执行命令
- c# - 如何绑定 LostFocus 和 GotFocus 事件以查看模型命令?
- ios - 创建自己的可可豆荚
- html - 将 HTML 过滤器应用于 nvarchar(max) 列上的 FREETEXT SQL 查询