本文介绍了如何在$ .get()完成之前等待在react.js中渲染视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
你好,我正在用reactjs编写一个聊天客户端,并希望使用从REST调用中检索到的数据来呈现我的组件.但是,我的组件是在REST请求返回数据之前呈现的.当我在子组件中调用this.props时,这会导致错误.
Hello I'm writing a chat client in reactjs and want to render my components with data retrieved from a REST call. However, my component is rendered before the REST request returns with data; this causes errors as I am calling this.props within my children components.
var MainChat = React.createClass({
getInitialData: function(){
var c = []
$.get("http://127.0.0.1:8888/test/sampledata.php?user=123", function(data, status) {
console.log("Data: "+ data+ "\nStatus: " + status);
c = data
})
},
getInitialState: function() {
return {
chatId : "",
chats : this.getInitialData(),
//chats: this.props.chats
};
},
handleClickOnLeftUser: function(data){
console.log("handleClickOnLeftUser");
// console.log("chat id is");
// console.log(data.chatID);
this.setState({chatID: data.chatID});
},
render: function() {
console.log("main:render")
console.log(this.props.chats);
var theThreadIWantToPass = {};
for(var i = 0; i < this.state.chats.length; i++)
{
console.log("chat: " + this.state.chats[i].chatID);
if (this.state.chats[i].chatID === this.state.chatID) {
theThreadIWantToPass = this.state.chats[i];
break;
}
}
return (
<div className="chatapp">
<div className="thread-section">
<div className="thread-count">
</div>
<LeftUserList
chats={this.state.chats}
clickFunc={this.handleClickOnLeftUser} // ***important
/>
</div>
<div>
<RightMessageBox chat={theThreadIWantToPass} />
</div>
</div>
);
}
});
推荐答案
在您的情况下,您需要使用方法 componentDidMount
,就像这样
In your case you need use method componentDidMount
, like so
var MainChat = React.createClass({
getInitialData: function() {
var url = 'http://127.0.0.1:8888/test/sampledata.php?user=123';
$.get(url, function(data, status) {
this.setState({ chats: data });
}.bind(this))
},
componentDidMount: function () {
this.getInitialData();
},
getInitialState: function() {
return {
chatId: '',
chats: []
};
},
handleClickOnLeftUser: function(data){
this.setState({ chatID: data.chatID });
},
render: function() {
var theThreadIWantToPass = {};
for(var i = 0; i < this.state.chats.length; i++) {
if (this.state.chats[i].chatID === this.state.chatID) {
theThreadIWantToPass = this.state.chats[i];
break;
}
}
return (
<div className="chatapp">
<div className="thread-section">
<div className="thread-count"></div>
<LeftUserList
chats={this.state.chats}
clickFunc={this.handleClickOnLeftUser} />
</div>
<div>
<RightMessageBox chat={theThreadIWantToPass} />
</div>
</div>
);
}
});
注意-使用"async": false
这是不好的做法
Note - using "async": false
this is bad practice
这篇关于如何在$ .get()完成之前等待在react.js中渲染视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!