로컬 파일에서 React JS로 json 데이터로드


78

React 구성 요소가 있고 파일에서 JSON 데이터를로드하고 싶습니다. 변수 데이터 를 전역으로 생성하더라도 현재 콘솔 로그가 작동하지 않습니다.

'use strict';

var React = require('react/addons');

// load in JSON data from file
var data;

var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.open("get", "data.json", true);
oReq.send();

function reqListener(e) {
    data = JSON.parse(this.responseText);
}
console.log(data);

var List = React.createClass({
  getInitialState: function() {
    return {data: this.props.data};    
  },
  render: function() {
    var listItems = this.state.data.map(function(item) {
        var eachItem = item.works.work;        

        var photo = eachItem.map(function(url) {
            return (
                <td>{url.urls}</td> 
            )
        });
    });
    return <ul>{listItems}</ul>
  }
});

var redBubble = React.createClass({
    render: function() {
      return (
        <div>
          <List data={data}/>          
        </div>
      );
    }
  });

module.exports = redBubble;

이상적으로는 이와 같은 작업을하고 싶지만 작동하지 않습니다 . 파일 이름 끝에 ".js" 를 추가하려고합니다 .

var data = require('./data.json');

최선의 방법, 가급적 "React"방법에 대한 조언을 주시면 감사하겠습니다!


1
console.log작품 잘, 당신은 단지 그것을 전에 전화하는거야 reqListener적이라고합니다.
Jordan Running

답장을 주셔서 감사합니다 Jordan. 코드에서 reqListener 다음에 나오므로 이해하는지 확실하지 않습니다. 자세히 설명해 주시겠습니까?
Desmond

1
Ajax 요청에는 시간이 걸립니다. JavaScript는 다음 지침으로 이동하기 전에 요청이 완료 될 때까지 기다리지 않습니다 (요청을 완료하는 데 몇 분 또는 몇 시간이 걸릴 수 있기 때문). 이를 "비동기"(또는 때때로 "비 차단") 실행이라고합니다. send()가 호출 된 직후 console.log호출되고 ... 얼마 후 Ajax 요청이 완료되고 reqListener호출됩니다. Ajax 요청이 완료된 후에 만 ​​어떤 일이 일어나기를 원한다면 reqListener.
Jordan Running


감사합니다 조던, 이제 말이 되네요. 시간을내어 설명해 주셔서 감사 드리며 다른 링크가 도움이되었습니다. 모든 React 코드를 reqListener 내부로 옮기려고 했으므로 콜백에서 작동하지만 나쁜 생각 인 것 같습니다. 나머지 코드를 실행하기 전에 응답을 기다리는 방법이 있습니까? 다시 한 번 감사드립니다.
Desmond

답변:


16

비동기 연결을 열고 있지만 동기식 인 것처럼 코드를 작성했습니다. reqListener콜백 함수 (즉, 이전 코드와 동 기적으로 실행되지 않습니다 React.createClass)하지만 전체 조각은 실행 한 후에 만하고 응답은 원격 위치에서 수신 된.

당신이 제로 대기 시간이 양자 얽힘의 연결을 사용하지 않는 한,이는 모든 문을 실행 한 후. 예를 들어 수신 된 데이터를 기록하려면 다음을 수행합니다.

function reqListener(e) {
    data = JSON.parse(this.responseText);
    console.log(data);
}

dataReact 컴포넌트에서 의 사용 이 보이지 않으므로 이론적으로 만 제안 할 수 있습니다 . 콜백에서 컴포넌트를 업데이트 하지 않는 이유 는 무엇입니까?


도와 주셔서 대단히 감사합니다. 콜백에서 구성 요소를 업데이트하는 방법을 찾고 있었지만 운이 좋지는 않았습니다. 국가와 관련이 있습니까? 나는 여전히 React의 초보자입니다! 구성 요소가 작동하는 방식을 보여주기 위해 코드를 업데이트했습니다. 콜백시 데이터를 전달하는 방법을 알려주시겠습니까? 다시 한 번 감사드립니다!
Desmond

@Desmond 예, 상태가 변경되면 구성 요소가 다시 렌더링되므로 상태가 작동 할 수 있습니다.
John Weisz

4
zero-latency quantum-entanglement connection😂 어쩌면 그것의 시간 ... 너무 사람들이 더 이상 비동기에 대해 배울 필요가 없다는 것, 사람들을 발명하기
SSC

142

나는 똑같은 일을하려고 노력했고 이것이 나를 위해 일한 것입니다 (ES6 / ES2015).

import myData from './data.json';

나는 같은 것을 묻는 반응 네이티브 스레드에 대한이 답변에서 해결책을 얻었습니다 : https://stackoverflow.com/a/37781882/176002


11
이 방법을 webpack과 함께 사용하는 경우 가져온 json 파일에 대한 json-loader가 필요합니다.
kevr 2016

3
감사합니다! JSX에서 json 데이터에 액세스하는 간단한 방법을 찾고 있었는데, 바로 이것이었습니다!
Matt Brand

6
이렇게하면 JSON이 번들로 컴파일되어 JSON 파일 핫스왑이 불가능합니다. 많은 사용 사례에서는 괜찮을 것 같지만 제 경우에는 그렇지 않았습니다.
Wilson Biggs 2018

이 답변이 가장 정확한 답변으로 표시된 만에해야 json-loader패키지 예
에드 아킬

나를 위해 일했습니다. 롤업을 사용하고 있습니다. 이전에는 var data = import(‘./data.json’)Promise를 가져 왔습니다. import data from ‘./data.json’가져온 개체에 직접 액세스 할 수 있도록 변경 합니다.
Max MacLeod

25

구성 요소에서 파일을 사용할 수 있도록하는 가장 간단하고 효과적인 방법은 다음과 같습니다.

var data = require('json!./data.json');

json!경로 앞에 유의하십시오.


3
라이브러리를 추가하지 않으면 작동하지 않습니다. 이것은 React에서 기본적으로 지원되지 않기 때문입니다. 예를 들어 라이브러리 : - npmjs.com/package/json-loader
피나 Langote

2
json-loader최신 Webpack 버전에 포함되어 있지만 정확한 구문을 사용하려면 Webpack 구성에 무언가를 추가해야 할 수도 있습니다. 그것에 대해 조사하십시오.
agm1984

@ agm1984는 2015 년 이후로 변경되었습니다. 대신 완전한 답변을 제공하면 좋을 것입니다.
César D. Velandia

1
최신 Webpack 버전에는 json-loader가 포함되어 있으므로 설치하거나 구성 파일에서 선언 할 필요가 없습니다. 나는 그냥 시도하는 것이 좋습니다import FILE_AS_VARIABLE from './file/location.json'
agm1984

여기에서 답변을 참조하십시오 : stackoverflow.com/questions/43735486/…
agm1984

11
  1. 설치 json-loader:

    npm i json-loader --save

  2. data폴더 만들기 src:

    mkdir data

  3. 거기에 파일을 넣어

  4. 파일로드

    var data = require('json!../data/yourfile.json');


를 사용하지 않을 때 A에 "중요 종속성 : 종속성 요청은 표현식입니다"오류가 발생했습니다 json!. 감사.
secavfr

1
어쨌든 src 폴더 외부에서 .json 파일을 사용할 수 있습니까? 내가 사용하고 생성 - - 응용 프로그램 반응 내 프로젝트
Chamod Pathirana

9

두 개의 json 파일이있는 경우 :

import data from 'sample.json';

많은 json 파일 중 하나를 동적으로로드하려면 fetch대신 a를 사용해야 할 수 있습니다 .

fetch(`${fileName}.json`)
  .then(response => response.json())
  .then(data => console.log(data))

3

내 JSON 파일 이름 : terrifcalculatordata.json

[
    {
      "id": 1,
      "name": "Vigo",
      "picture": "./static/images/vigo.png",
      "charges": "PKR 100 per excess km"
    },
    {
      "id": 2,
      "name": "Mercedes",
      "picture": "./static/images/Marcedes.jpg",
      "charges": "PKR 200 per excess km"
    },
    {
        "id": 3,
        "name": "Lexus",
        "picture": "./static/images/Lexus.jpg",
        "charges": "PKR 150 per excess km"
      }
]

먼저 맨 위에 가져 오기 :

import calculatorData from "../static/data/terrifcalculatordata.json";

반환 후 :

  <div>
  {
    calculatorData.map((calculatedata, index) => {
        return (
            <div key={index}>
                <img
                    src={calculatedata.picture}
                    class="d-block"
                    height="170"
                />
                <p>
                    {calculatedata.charges}
                </p>
            </div>
                  

1

webpack config를 사용하여 JSON 파일을 외부로 추가 할 수 있습니다. 그런 다음 반응 모듈에서 해당 json을로드 할 수 있습니다.

이 답변을 보세요


0

앱 기능의 일부로 파일을로드하려는 경우 가장 좋은 방법은 해당 파일을 포함하고 참조하는 것입니다.

또 다른 접근 방식은 파일을 요청하고 런타임 중에로드하는 것입니다. 이것은 FileAPI 로 수행 할 수 있습니다 . 사용에 대한 또 다른 StackOverflow 답변이 있습니다. Javascript로 로컬 디스크 파일을 여는 방법?

React에서 사용하기 위해 약간 수정 된 버전을 포함하겠습니다.

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: null
    };
    this.handleFileSelect = this.handleFileSelect.bind(this);
  }

  displayData(content) {
    this.setState({data: content});
  }

  handleFileSelect(evt) {
    let files = evt.target.files;
    if (!files.length) {
      alert('No file select');
      return;
    }
    let file = files[0];
    let that = this;
    let reader = new FileReader();
    reader.onload = function(e) {
      that.displayData(e.target.result);
    };
    reader.readAsText(file);
  }

  render() {
    const data = this.state.data;
    return (
      <div>
        <input type="file" onChange={this.handleFileSelect}/>
        { data && <p> {data} </p> }
      </div>
    );
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.