기본 JSON을 화면에 렌더링하려는 반응 응용 프로그램이 있습니다. 아래에 JSON 객체의 작은 스 니펫을 배치하겠습니다. researchPage에서 데이터를 표현하려고합니다. 전체 구성 요소 클래스를 아래에 배치하겠습니다. 명확히하기 위해 추가 정보를 제공 할 수 있는지 알려주십시오.
db.json-데이터를 가져 오려는 JSON 파일입니다.
{
"hits": [
{
"_index": "issflightplan",
"_type": "issflightplan",
"_key": "IDP-ISSFLIGHTPLAN-0000000000000447",
"_version": 1,
"_score": null,
"ContentType": {
"__deferred": {
"uri": "https://bi.sp.iss.nasa.gov/Sites/FP/_api/Web/Lists(guid'a9421c5b-186a-4b14-b7b2-4b88ee8fab95')/Items(252)/ContentType"
}
researchPage-이것은 JSON 데이터도 렌더링하려는 구성 요소 페이지입니다. 콘솔을 봤는데 오류가 발생하지 않는 것 같습니다. 페이지가 표시되고 H1 레코드 메타 데이터도 화면에 렌더링되지만 그 아래에는 H3 또는 단락이 없습니다.
import React, { Component } from "react";
import ReactDOM from "react-dom";
import data from "../../data/db.json";
console.log(data);
class ResearchPage extends Component {
constructor(props) {
super(props);
this.state = {
isLoading: false,
error: null,
dataSet: [],
data: [],
}
}
componentDidMount() {
this.setState({ isLoading: true });
fetch(data)
.then((res) => {
debugger;
if (res.ok) {
return res.json();
} else {
throw Error("Error Fetching Data");
}
})
.then((data) => {
console.log(data);
this.setState({ data: data, isLoading: false });
})
.catch((error) => {
console.log((error) => this.setState({ error }));
});
}
render() {
const { error, isLoading, data } = this.state;
const dataItems = data.map((dataSet) => (
<div key={dataSet.id}>
<h3>{dataSet._index}</h3>
<p>{dataSet.uri}</p>
</div>
));
if (error) {
return <p style={{ color: "red" }}>{error.message}</p>;
}
if (!isLoading) {
return <p>Loading Data...</p>;
} else
return (
<div>
<h1>Record MetaData</h1>
{dataItems}
</div>
);
}
}
export default ResearchPage;
최신 정보:
나는 그것을 작동시켰다.
내가 직면 한 문제는 데이터를 표시하려고 할 때 render 메서드의 데이터가 초기화되지 않았지만 didmount 내부에서 매핑을 수행하고 목록에 액세스하려는 것처럼 보이기 때문에 지정해야한다는 것입니다. 그.
const hits = data.hits.map((dataSet) => (
<div key={dataSet.id}>
<h3>{dataSet._index}</h3>
<p>{dataSet.uri}</p>
</div>
));
this.setState({ data: hits, isLoading: false });
render() {
const { error, isLoading, data } = this.state;
if (error) {
return <p style={{ color: "red" }}>{error.message}</p>;
}
if (isLoading) {
return <p>Loading Data...</p>;
} else {
return (
<div>
<h1>Record MetaData</h1>
{data}
</div>
);
}
}
아 또한 db.json을 공용 디렉토리에 넣고 모듈을 찾을 수 없기 때문에 다음과 같이 액세스했습니다.
fetch("db.json", {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}})
.then (...)
문제 해결 방법
예제 테스트 데이터를 제공하여 IO 문제인지 확인하려면 json 객체를 수동으로 자바 스크립트 객체로 변환 할 수 있습니다.
this.setState({ data: [
{ _index: 'ia', uri: 'ub' },
{ _index: 'ib', uri: 'ub' },
], isLoading: false });
더 많은 설명
직면 한 문제
Component Lifecycle-ComponentDidMount는 렌더링이 실행 된 후 또는 동시에 실행됩니다. 이로 인해 매핑하려는 데이터가 아직 사용되지 않는 동시성 문제가 발생했습니다. DidMount 내부에서 맵을 수행하면 데이터가 준비된 후에 만 수행됩니다. 그 동안 렌더링의 {data}는 null이되고 아무것도 표시되지 않습니다. 이것을 테스트하고 싶다면 didmount 안에 슬립 / 블록을 놓고 블록이 완료 될 때까지 데이터가 표시되지 않는 것을 확인할 수 있습니다.
json 객체를 올바르게 탐색-data.hits.map 대신 data.map을 사용하면 실제로 액세스해야하는 특정 목록 "적중"(data.hits)이 아니라 전체 json 객체를 대상으로합니다. 다음으로 .map 함수는 해당 값을 사용할 수 있도록 각 반복에서 'dataSet'을 제공하는 해당 목록을 반복합니다.
잠재적-일반적으로 json 파일에서 데이터를 얻지 못하지만 웹 API에서 데이터를 얻지 못하므로 경험이 거의 없지만 일반적으로 파일에 액세스하려면 특수 라이브러리가 필요하거나 파일을 사용할 수있는 공용 폴더에 넣어야합니다. 프로젝트 전반에 걸쳐. http : // localhost : 3000 / db.json을 수행하여이를 테스트 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다