我如何在此React组件中分解对象的状态数组以使用单个字段数据

巴马

提取后,组件状态下的数组中有96个对象。除了年份,在某些情况下还包括月份,它们都是唯一的对象。不能静态设置年份,因为它会在某个时候明显改变。月份将从转换IntegerString我尝试将其映射,但出现错误提示cannot read property map of undefined但是,如果我console.log有数据,我将得到具有96个对象的数组。当我尝试破坏它时,我得到一个错误Invalid attempt to destructure non-iterable instance我的主要目标是采用年份并将其作为模板文字传递给,headerName以便将其作为以下所有数据的分组列加载。并采用月份整数并将其转换为该月份的字符串,下面是该组件的代码。

import React, { Component } from "react";
import { AgGridReact } from "ag-grid-react";

class ColumnGroups extends Component {
  constructor(props) {
    super(props);

    this.state = {
      columnDefs: [
        {
          headerName: "Year",
          field: "year",
          children: [
            {
              headerName: "Month",
              field: "month",
              width: 150,
              children: [
                  {
                  headerName: "Sold",
                  field: "sales",
                  width: 150
              },
              {
                  headerName: "Return",
                  field: "returns",
                  width: 150
              },
              {
                  headerName: "RMA%",
                  field: "rma",
                  width: 150
              }
                  ]
              }

              ],
              defaultColDef: {
                  editable: false,
                  sortable: true,
                  resizable: true,
                  filter: true
                },
                rowSelection: "multiple",
                rowGroupPanelShow: "always",
                pivotPanelShow: "always",
                paginationPageSize: 10,
                paginationNumberFormatter: function(params) {
                  return "[" + params.value.toLocaleString() + "]";
                },
                rowData: []


          }

      ],
  }

  }
  onGridReady = params => {
    this.gridApi = params.api;
    this.gridColumnApi = params.columnApi;

    const httpRequest = new XMLHttpRequest();
    const updateData = data => {
      this.setState({ rowData: data });
      params.api.paginationGoToPage(4);
    };

    httpRequest.open(
      "GET",
      "http://localhost:5000/api/salessummary"
    );
    httpRequest.send();
    httpRequest.onreadystatechange = () => {
      if (httpRequest.readyState === 4 && httpRequest.status === 200) {
        updateData(JSON.parse(httpRequest.responseText));
      }
    };
  };

  onPageSizeChanged(newPageSize) {
    var value = document.getElementById("page-size").value;
    this.gridApi.paginationSetPageSize(Number(value));
  }

render() {
  {console.log(this.state.rowData)}
    return (
        <div>
            <div>
                <div 
    className="ag-theme-balham"
    style={{ 
    height: '500px', 
    width: '100%' }} 
  >
      <div className="test-header">
        Page Size:
        <select onChange={this.onPageSizeChanged.bind(this)} id="page-size">
          <option value="10" selected="">
            10
          </option>
          <option value="100">100</option>
          <option value="500">500</option>
          <option value="1000">1000</option>
        </select>
      </div>
    <AgGridReact
      columnDefs={this.state.columnDefs}
      rowData={this.state.rowData}
      autoGroupColumnDef={this.state.autoGroupColumnDef}
      defaultColDef={this.state.defaultColDef}
      suppressRowClickSelection={true}
      groupSelectsChildren={true}
      debug={true}
      rowSelection={this.state.rowSelection}
      rowGroupPanelShow={this.state.rowGroupPanelShow}
      pivotPanelShow={this.state.pivotPanelShow}
      enableRangeSelection={true}
      pagination={true}
      paginationPageSize={this.state.paginationPageSize}
      paginationNumberFormatter={this.state.paginationNumberFormatter}
      onGridReady={this.onGridReady}
      >

    </AgGridReact>
  </div>
            </div>
        </div>

    )
}
}
export default ColumnGroups;

这是回来的部分无法读取未定义的属性“ map”

   <div>
           {
    this.state.rowData.map(data => <div>{data.year}</div> )
  }
</div>

数据如下

{
"year": 2019,
"month": 4,
"productStyle": "zzzzz",
"sales": 1,
"returns": 0,
"rma": 0
},

每年是完全一样的。映射返回了96年中我不需要的95年。它将改变,我希望这对于现场年份而言是动态的。而且我需要访问月份,以便可以将4月等更改integerstring3。

威尔曼法典

没有内置的JS方法可将Month数字格式化为可自行构建的字符串:

numToMonth(n){
    switch(n){
        case 1:
           return 'Jan'
        //... all months
        default:
           return 'Dec'
        }
}

您需要先验证才能映射。要更彻底地检查它是否存在及其数组:

render(){
    if(this.state.rowData && Array.isArray(this.state.rowData)){
        var items = this.state.rowData
    }
    return(
        <div>
            {items && items.map(item => <div>{item.Year}</div> )}
        </div>
    )
  }
}

如果您需要根据当年使用的一项,请查找:

render(){
    if(this.state.rowData && Array.isArray(this.state.rowData)){
        var item = this.state.rowData.find(data => data.year === new Date().getFullYear )
    }

    return(
        <div>
            {item && `${item.year} - ${this.numToMonth(item.month)}` }
        </div>
    )
}

如果您需要基于当前年份过滤器的许多项目:

render(){
    if(this.state.rowData && Array.isArray(this.state.rowData)){
        var items = this.state.rowData.filter(data => data.year === new Date().getFullYear )
    }

    return(
        <div>
            {item && items.map(items=> <div>{item.year} - {this.numToMonth(item.month)} </div>})
        </div>
    )
}

如果所有年份都相同,并且您需要和一串月份数字作为字符串:

render(){
    if(this.state.rowData && Array.isArray(this.state.rowData)){
        var items = this.state.rowData
    }
    return(
        <div>
            {items && items[0].year}
            {items && items.map(item => <div>{this.numToMonth(item.month)}</div> )}
        </div>
    )
  }
}

最后一个示例的可运行代码段:

class SomeComponent extends React.Component {
  state={
    rowData:[
      {year:1988,month:1},
      {year:1988,month:3},
      {year:1988,month:2},
      {year:1988,month:1},
    ]
  }
  numToMonth(n){
    switch(n){
        case 1:
           return 'Jan'
        case 2:
           return 'Feb'
        case 3:
           return 'March'
        //... all months
        default:
           return 'Dec'
        }
  }
  render(){
    if(this.state.rowData && Array.isArray(this.state.rowData)){
        var items = this.state.rowData
    }
    return(
        <div>
            {items && items[0].year}
            {items && items.map(item => <div>{this.numToMonth(item.month)}</div> )}
      </div>
    )
  }
}

ReactDOM.render(
  <SomeComponent />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>

<div id="react"></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用JavaScript从传入对象的数组中获取每个字段数据

如何从数据库中检索单个字段数组数据并将其分离-使用Laravel,PHP

我如何从React-Redux中的reducer状态更新对象数组中单个元素的名称字段?

我将如何在此对象数组上使用_.mapKey

如何在React函数组件中使用数组状态?

在React中,如何在不映射整个对象的情况下获取数据并在状态数组中呈现单个对象?

如何在JComboBox中分解单个值?

从所有记录创建单个字段数组

如何使用 postgres 在 Django 中获取数组字段数据

如何在单个对象/状态中存储来自两个组件的数据?

如何将useState变量值传递给INSERT数据react.js和mysql的对象字段数组?

如何在React组件状态下更新对象的单个属性?

如何在numpy数组中分解模式?

如何从json对象数组中选择单个字段?

如何使用React-redux在类组件中分配状态?

动态字段数组到单个对象 mongo db

使用formik在React中的字段数组

如何禁用组件中字段数组中的字段?

如何在React中使用对象数组渲染组件

如何在reactjs中分解组件并制作子组件?

如何在codeigniter的一列中插入多个字段数据

如何在React组件中使用数组映射JSON数据

如何使用 dexie 在索引数据库中保存对象,其中 1 个字段是对象数组?

如何使用单个ajax调用加载多个输入字段数据?

如何使用php将多个字段数据存储到同一变量中?

我如何更新状态以使用array.map函数更新数组内对象的值

Mongoose - 如何在 Mongoose 的填充字段数组中选择特定对象?

我如何使用knexjs(MySQL)批量删除。我在与单个字段匹配的数组中有条目

如何在 Laravel5 中插入数组字段数据