Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 组件安装时的Rest调用_Reactjs - Fatal编程技术网

Reactjs 组件安装时的Rest调用

Reactjs 组件安装时的Rest调用,reactjs,Reactjs,我在React组件的componentDidMount中调用REST服务: loadData: function () { return $.getJSON(this.props.server+"/xxxxx/"+this.props.params.promotionid); }, componentDidMount: function () { this.loadData().success(function (data) { console.log("Aft

我在React组件的componentDidMount中调用REST服务:

loadData: function () {
    return $.getJSON(this.props.server+"/xxxxx/"+this.props.params.promotionid);

},
componentDidMount: function () {
    this.loadData().success(function (data) {
        console.log("After success");
        console.log(data);
        if(this.isMounted())
        {
            this.setState({
                prom: data
                //release: data.Release
            });
        }
    }.bind(this))
}
即使没有包含ifthis.isMounted的文档建议,也可以这样做。请注意注释行。为了工作,我们需要对此进行评论。问题是,如果我从服务器获取的数据中有一个子对象,那么即使使用isMounted也无法工作。例如:

{
PromotionId: 1,
Description: "Hello three",
Category: "serviceid",
SpecialID: 23666,
ProjectManager: "Tarkidi Touvouda",
Requestor: "George Klapas",
Readiness: false,
SignOff: false,
SourceDestination: "developement-uat",
Status: "pending",
ReleaseId: 2,
Release: {
    ReleaseId: 2,
    ReleaseName: "Fall Second",
    ReleaseDate: "2015-10-05T00:00:00",
    ReleaseDeadline: "2015-10-05T00:00:00",
    ModifiedDate: "2015-10-21T12:48:45.753"
},
PromotionAssets: null,
ModifiedDate: "2015-10-21T12:48:45.753"
}

我在渲染时获得如下数据

var p=this.state.prom;
var rel=p.Release;
我尝试访问rel.ReleaseName时出错,该rel.ReleaseName找不到未定义的ReleaseName。使其工作的唯一方法是删除您看到的注释,也就是说,在state中有一个单独的字段,该字段将保存Release对象,然后:

var rel=this.state.release;
对释放对象的后续调用成功。我为什么要这样做?我的意思是为它有一个单独的状态字段?

$。getJSON是一个异步调用,这意味着在等待响应时执行将继续。因此,脚本调用componentDidMount,然后继续使用render,而不等待结果

因此,在第一轮渲染中,未定义变量this.state.prom。因此,调用this.state.prom.Release会引发错误,因为无法获取未定义对象的属性

一个简单的解决方案可能是等到AJAX调用完成并且状态已更新:

render: function() {
  if(!this.state.prom) {
    return <div>loading ...</div>;
  }
  // your code goes here
}

我知道它是异步的。它将函数调用为success。这不是问题所在。我不是说异步调用不起作用。但是第一次调用render时,this.state.prom未定义,因为调用尚未完成。您可能希望通过在渲染函数上调用调试器来检查这一点,或者简单地在渲染中粘贴console.logthis.state,以查看渲染时的状态。我很确定,当组件第一次呈现时,this.state没有属性prom,也没有属性发布。过来看!另一个修复方法是在getInitialState函数中给出状态的形状,例如getInitialState:function{return{prom:{};}。如果执行此操作,则始终会定义this.state.prom,这就是为什么this.state.prom.Release不会引发错误,即使该值在初始渲染过程中未定义。请注意,我最初发布的解决方案在使用此方法时不起作用;待定义。问题在于prom中的嵌套对象,释放。