【发布时间】:2016-12-09 19:44:32
【问题描述】:
我在 reactjs 中的状态方面遇到了一些困难。 据我所知,componentWillMount 是在渲染组件之前使用 ajax 调用加载数据的地方。 我有一个简单的项目,它使用加载的数据填充面板堆栈并将其显示在板上。然而,来自 ajax 调用的数据在渲染组件之前没有设置,这会导致使用空数组渲染电路板。以下是我的完整来源:
import React from "react";
export class Panel extends React.Component{
render() {
return (
<div>
<div className="row panel">
<div className="col-sm-12 header">sfsfsf</div>
<div className="col-sm-12 body">fsdfsfs</div>
<div className="col-sm-12 footer">fasfaf</div>
</div>
</div>
);
}
}
作为问题根源的 Board 类如下:
import React from "react";
import {Panel} from "./Panel";
export class Board extends React.Component{
constructor(props){
super();
this.state={news: []};
}
componentWillMount(){
this.state={news: []};
$.ajax({
url: "http://localhost:3003/json.txt",
dataType: 'json',
cache: false,
success: function(data) {
var arr=[];
for (var key in data) {
arr.push(data[key]);
console.log(data[key]);
}
this.state={news: arr};
}});
}
render() {
return (
<div>
{
this.state.news.map((item,i)=> <Panel key="i"/>)
}
</div>
);
}
}
最后一个类是 index.js:
import React from "react";
import {render} from "react-dom";
import {Board} from "./component/Board";
class App extends React.Component{
render(){
return(
<div>
<Board/>
</div>
);
}
}
render(<App/>, document.getElementById('middle'));
正如您在 Board.js 类中看到的那样,我在渲染函数中初始化我的数组,然后我使用 componentWillMount 填充我希望它在 componentWillMount 完成后发生的新闻数组,但在我的情况下,当渲染发生。有什么想法吗?
*********更新***************
我也用 componentDidMount 试过了,但是没用,同样的问题
【问题讨论】:
-
您所描述的是调用异步函数的预期结果。无论你在哪里调用它,React 生命周期都会在不等待服务器回调的情况下进行渲染。您应该尝试同步调用(不太好)或将 AJAX 调用一个组件,然后将结果作为道具传递给您的
Board。