【发布时间】:2015-10-23 20:03:41
【问题描述】:
我有一个 React 组件,我想从文件中加载我的 JSON 数据。控制台日志当前不起作用,即使我将变量 data 创建为全局变量
'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”方式,将不胜感激!
【问题讨论】:
-
console.log工作正常,您只是在调用reqListener之前调用它。 -
感谢乔丹的回复。在代码中它出现在 reqListener 之后,所以我不确定我是否理解。能详细点吗?
-
您的 Ajax 请求需要时间。 JavaScript 在继续下一条指令之前不会等待请求完成(因为请求可能需要几分钟甚至几小时才能完成)。我们称之为“异步”(或有时“非阻塞”)执行。在
send()被调用后,console.log被立即调用……一段时间后,Ajax 请求完成,reqListener被调用。如果您希望仅在 Ajax 请求完成后发生某些事情,则必须在reqListener中实现该事情。 -
谢谢乔丹,现在确实有道理。感谢您花时间解释,其他链接有所帮助。我试图将我所有的 React 代码移到 reqListener 中,这样它就可以在回调中工作,但这似乎是个坏主意。有没有办法在运行其余代码之前等待响应?再次感谢。
标签: javascript ajax json xmlhttprequest reactjs