将本地文件中的json数据加载到React JS中

时间:2015-08-01 04:03:22

标签: javascript ajax json xmlhttprequest reactjs

我有一个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”方式,我们将不胜感激!

8 个答案:

答案 0 :(得分:91)

我试图做同样的事情,这对我有用(ES6 / ES2015):

import myData from './data.json';

我从一个反应原生线程中得到了这个答案的解决方案,问同样的事情:https://stackoverflow.com/a/37781882/176002

答案 1 :(得分:21)

使组件可用的最简单,最有效的方法是:

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

请注意路径前的json!

答案 2 :(得分:13)

您正在打开asynchronous connection,但您已将代码编写为同步。 decodeBase64Image = function(dataString) { var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/), response = {}; if (matches.length !== 3) { return new Error('Invalid input string'); } response.type = matches[1]; response.data = new Buffer(matches[2], 'base64'); return response; }; 回调函数不会与您的代码同步执行(即reqListener之前),但只有在整个代码段运行后才会执行,并且已从远程位置收到响应。

除非您处于零延迟量子纠缠连接,否则在所有语句运行后,。例如,要记录接收的数据,您将:

React.createClass

我没有看到在React组件中使用function reqListener(e) { data = JSON.parse(this.responseText); console.log(data); } ,所以我只能在理论上提出这个建议:为什么不在回调中更新你的组件?

答案 3 :(得分:8)

  1. 安装json-loader

    npm i json-loader --save

  2. data中创建src文件夹:

    mkdir data

  3. 将您的文件放在那里

  4. 加载您的文件

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

答案 4 :(得分:2)

我的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>
                  

答案 5 :(得分:1)

如果您有几个json文件:

fetch

如果要动态加载许多json文件之一,则可能必须使用fetch(`${fileName}.json`) .then(response => response.json()) .then(data => console.log(data)) 来代替

changeButton

答案 6 :(得分:0)

您可以使用webpack配置将JSON文件添加为外部文件。然后你可以在你的任何反应模块中加载那个json。

查看this answer

答案 7 :(得分:-1)

如果您要加载文件,作为应用功能的一部分,那么最好的方法是包含和引用该文件。

另一种方法是请求文件,并在运行时加载它。这可以使用FileAPI来完成。还有另一个关于使用它的StackOverflow答案: How to open a local disk file with 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>
    );
  }
}