如何在React中以表格形式显示JSON数据

时间:2020-02-08 17:43:55

标签: javascript json reactjs api html-table

我正在使用一个API,该API返回各种不同键值对的JSON。我试图将它们显示在render()内,作为2列(键和值)的表,分别在其中包含对象键和值。

  1. fetchBasicDetails()中的API是POST,它使用默认的this.state值作为输入并返回JSON输出。
  2. 然后使用setState方法将JSON输出对象存储到this.state的 birth_details 属性。
  3. 然后,我尝试使用<table>和Object.keys在forEach标记中显示对象数据,但什么也没显示。

感谢您的帮助。谢谢。

export default class HoroscopeReport extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      day: 11,
      month: 2,
      year: 2019,
      hours: 12,
      minutes: 59,
      tzone: 5.5,
      lat: 19.22,
      lon: 25.2,
      birth_details:{}
    };
  }

  handleSubmit = event => {
    event.preventDefault();
    //console.log("Received user submitted data"+JSON.stringify(this.state))
    this.fetchBasicDetails();
  };

  fetchBasicDetails() {
        let myHeaders = new Headers();
        myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
        myHeaders.append("Authorization", "Basic XXXXXXXXXXXXXXX");

        let urlencoded = new URLSearchParams();
        urlencoded.append("day", this.state.day);
        urlencoded.append("month", this.state.month);
        urlencoded.append("year", this.state.year);
        urlencoded.append("hour", this.state.hours);
        urlencoded.append("min", this.state.minutes);
        urlencoded.append("lat", this.state.lat);
        urlencoded.append("lon", this.state.lon);
        urlencoded.append("tzone", this.state.tzone);

        let requestOptions = {
          method: 'POST',
          headers: myHeaders,
          body: urlencoded,
          redirect: 'follow'
        };

        fetch("https://json.astrologyapi.com/v1/birth_details", requestOptions)
          .then(response => response.text())
          .then(result => {
            this.setState({ birth_details: result });
          })
          .catch(error => console.log('error', error));
       }

  render() {

    return (
      <div>
{/* FORM SUBMITTION CODE HERE */}
              <h2>Output:-</h2>
              <table border={2} cellPadding={5}>
                <thead>
                  <tr>
                    <td>Key</td>
                    <td>Value</td>
                  </tr>
                </thead>
                <tbody>
                  Object.keys(this.birth_details).forEach(function (element) {
                  return <tr><td>element</td><td>this.birth_details[element]</td></tr>;
                  });
                </tbody>
              </table>
      </div>
    );
  }
}

作为参考,这是JSON的输出:-

{"year":2019,"month":2,"day":11,"hour":12,"minute":59,"latitude":19.22,"longitude":25.2,"timezone":5.5,"gender":" ","name":" ","seconds":0,"ayanamsha":24.124044280610406,"sunrise":"10:19:50","sunset":"21:47:13"}

2 个答案:

答案 0 :(得分:1)

通常,在React中基于数组的元素渲染用map()而不是forEach()处理。原因是使用map()可以在迭代的同时操作每个元素,并为render方法返回完全适合的 JSX 语法。同时forEach()不返回任何内容,仅返回undefined

我想您可以尝试以下操作:

render() {
    return (
      <div>
        <h2>Output:-</h2>
        <table border={2} cellPadding={5}>
           <thead>
              <tr>
                <td>Key</td>
                <td>Value</td>
              </tr>
           </thead>
           <tbody>
              {
                  this.state.birth_details && 
                  Object.keys(this.state.birth_details).map(function (element) {
                     return <tr>
                       <td>{element}</td>
                       <td>{this.state.birth_details[element]}</td>
                     </tr>;
                  });
              }
           </tbody>
        </table>
      </div>
    );
}

希望对您有帮助!

答案 1 :(得分:0)

请记住,您需要在JSX中使用花括号来表示要呈现值,而不是按原样显示代码。

您还将希望使用map而不是forEachmap用于将数组转换为其他数组(我们正在获取字符串列表并将其映射到React元素中),而forEach用于仅对每个元素执行某些操作而不返回任何内容

另外,您可能是指this.state.birth_details而不是this.birth_details>

<tbody>
{
  Object.keys(this.state.birth_details).map(function (element) {
    return (
      <tr key={element}>
        <td>{element}</td>
        <td>{this.state.birth_details[element]}</td>
      </tr>
    );
  })
}
</tbody>

我还对返回的元素设置了key。在React here中了解有关列表和键的更多信息。