我有一个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”方式,我们将不胜感激!
答案 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)
安装json-loader
:
npm i json-loader --save
在data
中创建src
文件夹:
mkdir data
将您的文件放在那里
加载您的文件
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。
答案 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>
);
}
}