我是新来的反应和流量,我很难弄清楚如何从服务器加载数据。我可以从本地文件加载相同的数据,而不会出现问题。如何在REACT和FLUX中创建API调用
信息首先我有向下传递初始状态的视图此控制器视图(控制器view.js)(view.js)
控制器view.js
var viewBill = React.createClass({
getInitialState: function(){
return {
bill: BillStore.getAllBill()
};
},
render: function(){
return (
<div>
<SubscriptionDetails subscription={this.state.bill.statement} />
</div>
);
}
});
module.exports = viewBill;
view.js
var subscriptionsList = React.createClass({
propTypes: {
subscription: React.PropTypes.array.isRequired
},
render: function(){
return (
<div >
<h1>Statement</h1>
From: {this.props.subscription.period.from} - To {this.props.subscription.period.to} <br />
Due: {this.props.subscription.due}<br />
Issued:{this.props.subscription.generated}
</div>
);
}
});
module.exports = subscriptionsList;
我有一个行动文件加载INITAL数据为我的应用程序。因此,这是数据是不由用户操作,调用,但在控制器视图从称为getInitialState
InitialActions.js
var InitialiseActions = {
initApp: function(){
Dispatcher.dispatch({
actionType: ActionTypes.INITIALISE,
initialData: {
bill: BillApi.getBillLocal() // I switch to getBillServer for date from server
}
});
}
};
module.exports = InitialiseActions;
然后我的数据API看起来像这样
api.js
var BillApi = {
getBillLocal: function() {
return billed;
},
getBillServer: function() {
return $.getJSON('https://theurl.com/stuff.json').then(function(data) {
return data;
});
}
};
module.exports = BillApi;
这是店里因此,正如我前面提到的,当我加载数据在本地使用BillApi.getBillLocal()的行动,一切工作正常 store.js
var _bill = [];
var BillStore = assign({}, EventEmitter.prototype, {
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},
removeChangeListener: function(callback) {
this.removeListener(CHANGE_EVENT, callback);
},
emitChange: function() {
this.emit(CHANGE_EVENT);
},
getAllBill: function() {
return _bill;
}
});
Dispatcher.register(function(action){
switch(action.actionType){
case ActionTypes.INITIALISE:
_bill = action.initialData.bill;
BillStore.emitChange();
break;
default:
// do nothing
}
});
module.exports = BillStore;
。但是,当我改变BillApi.getBillServer()我得到在控制台中followind错误...
Warning: Failed propType: Required prop `subscription` was not specified in `subscriptionsList`. Check the render method of `viewBill`.
Uncaught TypeError: Cannot read property 'period' of undefined
我还添加了的console.log(数据)BillApi.getBillServer(),我可以看到,数据从服务器返回。但它显示AFTER我得到的控制台,我认为可能是问题的警告。任何人都可以提供一些建议或帮助我解决它?对不起,这么长的帖子。
UPDATE
我做了一些更改api.js文件(点击此处变革和DOM错误plnkr.co/edit/HoXszori3HUAwUOHzPLG),因为它是建议,这个问题是由于我如何处理承诺。但它仍然是你在DOM错误中看到的同样的问题。
你在传递什么'subscriptionsList'?它正在寻找'this.props.subscriptions',并且它不存在,所以你得到'不能读取'undefined'属性'时期'。我的猜测是你也有一些类型的竞争条件。通量本质上是异步的... –
我想也许多数民众赞成为什么我得到'无法读取'的错误 - 由于竞争条件。数据可能尚未加载?任何提示如何解决这个问题? –
是的,你可以使用superlame建议的回调方法,或者你可以给'_bill'一个默认对象,比如'var _bill = {subscriptions:[]}',所以当你执行'getInitialState'时,你只需要'bill'通过'store.getAllBill()'。那么当组件装入时,数据被提取,并且商店将发出更改并更新您的状态 –