【问题标题】:ReactJS iterate through state array with dynamic key with its dataReactJS 使用动态键及其数据遍历状态数组
【发布时间】:2019-07-06 23:42:10
【问题描述】:

我有一个类似的数组:

"data": {
    "key1": {
        "key_val1": "data1",
        "key_val2": "data2",
        "key_val3": "data3",
        "key_val4": "data4",

    },
    "key2": {
        "key_val1": "data1",
        "key_val2": "data2",
        "key_val3": "data3",
        "key_val4": "data4",

    },
    "key3": {
        "key_val1": "data1",
        "key_val2": "data2",
        "key_val3": "data3",
        "key_val4": "data4",

    }
}

我想迭代这个数组并填充我的表,但我收到错误 this.state.data.map() is not a function

这是我的反应组件:

import React, { Component } from "react";
import $ from "jquery";
import axios from "axios";

class DataComponent extends Component {
  state = {
    data: [],
    isLoading: true
  };
  componentDidMount() {
    this.getData();
  }

  getData() {
    var curr_date = new Date().toISOString().substring(0, 10);
    const params = new FormData();
    params.append("date", curr_date);
    axios
      .post(`http://api.mydomain.in/getdataList/`, params)
      .then(res => {
        if (res.data.result === 1) {
          this.setState({
            data: res.data.data,
            isLoading: false
          });
        }
        if (!this.state.isLoading) {
          this.initTable();
        }

      })
      .catch(err => {
        console.log(err);
      });
  }

  initTable() {
    $("#my_table").DataTable({
      bLengthChange: false,
      lengthMenu: [[15, 15, 15, "All"]],
      language: {
        search: "_INPUT_",
        searchPlaceholder: "Search records"
      }
    });
  }

  render() {
    return (
      <div className="tab-pane active" id="mytab">
        <div className="inner-content table-responsive">
          <table id="my_table" className="display" style={{ width: "100%" }}>
            <thead>
              <tr className="heading-table">
                <th>Col1</th>
                <th>col2 </th>
                <th>col3 </th>
                <th>col4 </th>
                <th>col5 </th>
              </tr>
            </thead>
            {this.state.isLoading ? null : (
              <tbody>
                {this.state.data.map(d => (
                  <tr>
                    <td>{d}</td>
                    <td>{d.key_val1}</td>
                    <td>{d.key_val2}</td>
                    <td>{d.key_val3}</td>
                    <td>{d.key_val4}</td>
                  </tr>
                ))}
              </tbody>
            )}
          </table>
        </div>
      </div>
    );
  }
}

export default DataComponent;

this.state.data 将使用如上所示的示例数组进行更新。

我怎样才能做到这一点? 我也试过Object.keys(this.state.data).map(),但没有运气。

提前致谢。

【问题讨论】:

    标签: reactjs state react-state-management react-state


    【解决方案1】:

    您的 data 变量是 JSON 对象,而不是数组。要将其转换为数组并同时获取键和值,可以使用Object.entries

    此函数将返回一个包含其他数组的数组,其中键作为您的第一个值,值作为第二个:

    {Object.entries(this.state.data).map(([key, value]) => (
        <tr key={key}>
            <td>{key}</td>
            <td>{value.key_val1}</td>
            <td>{value.key_val2}</td>
            <td>{value.key_val3}</td>
            <td>{value.key_val4}</td>
        </tr>
    ))}
    

    如果您不需要对象的密钥,可以使用Object.values

    使用解构的替代方法:

    {Object.entries(this.state.data).map(([key, { key_val1, key_val2, key_val3, key_val4 }]) => (
        <tr key={key}>
            <td>{key}</td>
            <td>{key_val1}</td>
            <td>{key_val2}</td>
            <td>{key_val3}</td>
            <td>{key_val4}</td>
        </tr>
    ))}
    

    另一个使用嵌套映射的版本,适用于任何类型的对象:

    {Object.entries(this.state.data).map(([key, value]) => (
        <tr key={key}>
            <td>{key}</td>
            {Object.entries(value).map(([name, data]) => <td key={name} >{data}</td>)}
        </tr>
    ))}
    

    【讨论】:

      【解决方案2】:

      我相信这是因为您试图通过this.state.data.map() 从尚无任何数据的数组中提取元素在初始渲染期间,您的组件状态中还没有任何数据,而您的@987654322 @ 方法在初始渲染之后才会运行。在执行this.state.data.map 之前,您可以进行快速初始检查以查看您的状态是否有数据

      {this.state.data ? this.state.data.map(d => (
              <tr>
                  <td>{d}</td>
                  <td>{d.key_val1}</td>
                  <td>{d.key_val2}</td>
                  <td>{d.key_val3}</td>
                  <td>{d.key_val4}</td>
              </tr>
        )) : null }
      

      【讨论】:

      • 是的,因此我使用了this.state.isLoading。最初该值为 true,并且不会执行 this.state.data.map。当this.state.data 填充了api调用时,我将其设为假。
      猜你喜欢
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多