开发者问题收集

未定义的 React JS 变量

2018-06-04
2296

这是我第一次使用 Javascript/React JS 编写代码,所以我不确定这里出了什么问题。getLicensees() 向我的 API 发送 GET 请求并返回所有被许可人。到目前为止,此方法有效,控制台日志也正常工作并打印正确的值。

constructor(props) {
super(props);

this.state = {licensees: []};

let licenseeResponse = LicensingService.getLicensees()
  .then(licensees => {
    this.state.licensees = licensees;
    console.log("component", licensees);
    console.log(licensees[0].city);
  });
}

我试图从被许可人对象内的所有信息生成一个表格。但我无法在 render() 方法中使用 this.state.licensees[0].city

render() {
return (
  <main id="content">
    <div id="head">
      <h4 className="headline">
        Liste aller Lizenznehmer
      </h4>

      <div className="licenseeTable">
        <table>
          <tr>
            <th>Lizenz nehmer</th>
            <th>Aktuelles Zertifikat</th>
            <th>Details</th>
          </tr>
          <tr>
            <td>{this.state.licensees[0].city}</td>
            <td>test2</td>
            <td>test3</td>
          </tr>
        </table>
      </div>
    </div>
  </main>
);
}

我该如何正确执行此操作?

--我的解决方案:

componentDidMount() {
console.log('component did mount..', this);
LicensingService.getLicensees()
  .then(licensees => {
    this.setState({licensees});
    console.log(licensees);
  });
}

...

{
            this.state.licensees.map(license => {
              return <tr>
                <td>{license.company}</td>
                <td>{license.testCertificate.toString()}</td>
                <td>{license.city}</td>
              </tr>
            })
          }

this.setState({licensees}) 是向状态对象分配值的正确方法。

2个回答

问题是,尽管您在构造函数中提出了 API 请求,但它只会在渲染周期后返回响应,并且由于您直接在已解析的承诺中改变状态,因此不会调用重新渲染。

您需要做的是在 componentDidMount 生命周期方法中进行 API 调用,并使用 setState 更新您的状态

constructor(props) {
   super(props);

   this.state = {licensees: []};

}

componentDidMount() {
    LicensingService.getLicensees()
      .then(licensees => {
        this.setState({licensees});
        console.log("component", licensees);
        console.log(licensees[0].city);
    });
}
Shubham Khatri
2018-06-04

首先,您需要将 api 调用移至 componentDidMount 而不是在构造函数中执行,这样做不会起作用,因为您的组件在您获取数据之前就已经渲染好了。

然后,您需要使用 setState 来调用您的渲染函数,以便显示更新后的值。像这样:

this.setState({licensees}); 而不是像

this.state.licensees = licensees;
那样直接改变状态

在这里阅读更多内容 正确使用状态

您还需要等待该值,直到您尝试访问它,因此您也必须在渲染中进行此更改 而不是这样:

<td>{this.state.licensees[0].city}</td>

这样做

{this.state.licensees && <td>{this.state.licensees[0].city}</td>} //only render when you have the value in the state.
supra28
2018-06-04