gpt4 book ai didi

reactjs - componentWillMount 在渲染之前未完成

转载 作者:行者123 更新时间:2023-12-03 14:00:16 24 4
gpt4 key购买 nike

我在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,但它不起作用并且出现同样的问题

最佳答案

componentWillMount() 在渲染之前完成,但由于 ajax 是异步的,因此在请求完成之前不会执行。

您不应使用 this.state = ... 设置状态。而是使用:

this.setState({news: arr});

这将设置值并触发组件和所有子组件进行渲染。只需编写渲染函数来很好地处理空数据,您就会得到预期的结果,而不会阻止 JS 执行。

正如这里所建议的,它具有正确的绑定(bind):

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>
);
}
}

箭头函数处理绑定(bind)。类似于 function(){}.bind(this)

关于reactjs - componentWillMount 在渲染之前未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com