componentWillMount 在渲染之前没有完成
componentWillMount does not finish before render
我在 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>
);
}
}
和主板class这是一个问题的根源如下:
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>
);
}
}
另外最后一个class是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 class 中看到的那样,我在渲染函数中初始化我的数组,然后使用 componentWillMount 填充新闻数组,我希望它在 componentWillMount 完成后发生,但是在我的例子中,渲染发生时数组是空的。有什么想法吗?
*********更新***************
我也用 componentDidMount 试过,但没用,还是同样的问题
您正在执行一个 ajax 异步调用...根据定义,它将继续执行代码而不等待 ajax 的响应。
您可以通过在 $.ajax 选项上设置 async: false 来实现同步。
componentWillMount()
在渲染之前完成,但因为 ajax 是异步的,所以在请求完成之前不会执行。
您不应使用 this.state = ...
设置状态。而是使用:
this.setState({news: arr});
这将设置值并触发组件和所有子项进行渲染。只需编写您的渲染函数来很好地处理空数据,您就可以在不阻塞 JS 执行的情况下获得预期的结果。
如这里所建议的那样,它具有正确的绑定:
import React from "react";
import {Panel} from "./Panel";
export class Board extends React.Component{
constructor(props){
super();
}
getInitialState() {
return {news: []};
}
componentWillMount(){
$.ajax({
url: "http://localhost:3003/json.txt",
dataType: 'json',
cache: false,
success: (data) => {
var arr=[];
for (var key in data) {
arr.push(data[key]);
console.log(data[key]);
}
this.setState({news: arr});
}
});
}
render() {
return (
<div>
{
this.state.news.map((item,i)=> <Panel key="i"/>)
}
</div>
);
}
}
箭头函数处理绑定。类似于 function(){}.bind(this)
我在 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>
);
}
}
和主板class这是一个问题的根源如下:
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>
);
}
}
另外最后一个class是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 class 中看到的那样,我在渲染函数中初始化我的数组,然后使用 componentWillMount 填充新闻数组,我希望它在 componentWillMount 完成后发生,但是在我的例子中,渲染发生时数组是空的。有什么想法吗?
*********更新***************
我也用 componentDidMount 试过,但没用,还是同样的问题
您正在执行一个 ajax 异步调用...根据定义,它将继续执行代码而不等待 ajax 的响应。
您可以通过在 $.ajax 选项上设置 async: false 来实现同步。
componentWillMount()
在渲染之前完成,但因为 ajax 是异步的,所以在请求完成之前不会执行。
您不应使用 this.state = ...
设置状态。而是使用:
this.setState({news: arr});
这将设置值并触发组件和所有子项进行渲染。只需编写您的渲染函数来很好地处理空数据,您就可以在不阻塞 JS 执行的情况下获得预期的结果。
如这里所建议的那样,它具有正确的绑定:
import React from "react";
import {Panel} from "./Panel";
export class Board extends React.Component{
constructor(props){
super();
}
getInitialState() {
return {news: []};
}
componentWillMount(){
$.ajax({
url: "http://localhost:3003/json.txt",
dataType: 'json',
cache: false,
success: (data) => {
var arr=[];
for (var key in data) {
arr.push(data[key]);
console.log(data[key]);
}
this.setState({news: arr});
}
});
}
render() {
return (
<div>
{
this.state.news.map((item,i)=> <Panel key="i"/>)
}
</div>
);
}
}
箭头函数处理绑定。类似于 function(){}.bind(this)