【问题标题】:react-table: unable to interpolate nested json data inside react-tablereact-table:无法在 react-table 内插入嵌套的 json 数据
【发布时间】:2020-07-09 07:40:58
【问题描述】:

这是完整的代码

我有一个react-table。版本6.1.1。我在上面的codeSandbox中添加了完整的代码,并在下面添加了相关的代码sn-ps。

我可以为[0] index 插入数据,但是我无法对所有条目进行插入,这就是问题所在。

我为[0] index 所做的方式,我想做类似的事情。但是,不确定如何实现。

自定义单元格代码

MyCell({
    value,
    columnProps: {
      rest: { someFunc }
    }
  }) {
    const data = {
      // labels: value.map((val, idx) => {
      //   return idx;
      // }),
      datasets: [
        {
          backgroundColor: [
            "#ff8779",
            "#2a84e9",
            "#e2e2e2",
            "#ff8779",
            "#2a84e9",
            "#e2e2e2"
          ],
          data: value
        }
      ]
    };

    return <Pie data={data} />;
  }

列代码

  columns = [
    // * embedding checkbox
    {
      Header: "Select",
      Cell: row => (
        <input
          type="checkbox"
          defaultChecked={this.state.checked[row.index]}
          checked={this.state.checked[row.index]}
        />
      )
    },
    {
      Header: "System",
      accessor: "sites[0].systems[0].systemName"
    },
    {
      Header: "Measurement",
      accessor: "sites[0].systems[0].measurements[0].name"
    },
    {
      Header: "Min",
      accessor: "sites[0].systems[0].measurements[0].min"
    },
    {
      Header: "Max",
      accessor: "sites[0].systems[0].measurements[0].max"
    },
    {
      Header: "Avg",
      accessor: "sites[0].systems[0].measurements[0].average"
    },
    {
      Header: "Last",
      accessor: "sites[0].systems[0].measurements[0].last"
    },
    {
      Header: "Bar",
      accessor: "sites[0].systems[0].measurements[0].buckets.values",
      Cell: this.MyCell
    }
  ]; 

react-table componentrender() 的代码

            <ReactTable
                  className="-striped -highlight"
                  ref={r => (this.reactTable = r)}
                  data={[...measurementsData]}
                  pageSize={
                    measurementsData.length > 10 ? 10 : measurementsData.length
                  }
                  filterable
                  resizable={true}
                  columns={this.columns}
                  showPaginationTop={false}
                  showPaginationBottom={false}
                />

【问题讨论】:

    标签: javascript reactjs interpolation react-table


    【解决方案1】:

    你需要写一个自定义的Cell函数

    对不起,但我不知道如何“花哨”-展平数组,所以我在回答您之前的问题时使用了相同的方法

      renderJson(sites, property) {
        let flat = sites.map(md => md.systems);
        flat = [].concat(...flat);
        flat = flat.map(md => md.measurements);
        flat = [].concat(...flat);
    
        return (
          <div>
            {flat.map(measurement => {
              return (
                <>
                  {measurement[property]}
                  <br />
                </>
              );
            })}
          </div>
        );
      }
    

    然后

          Cell: row => {
            return this.renderJson(row.original.sites, 'name')
          }
    .
    .
    .
          Cell: row => {
            return this.renderJson(row.original.sites, 'min')
          }
    .
    .
    .
          Cell: row => {
            return this.renderJson(row.original.sites, 'max')
          }
     
    

    这是查看实际操作的链接 https://codesandbox.io/s/stoic-mclaren-kvmpg

    【讨论】:

    • 正确。明白了。但即使采用这种方法,我们也必须这样做[0] index。我想为sites.systems.systemName 等所有索引中的所有条目执行此操作。一种通用的方法。
    • 好的,您还需要为其他列复制这部分代码。也许您可以编写一个可以展平数组的中心通用/抽象函数,然后将其作为参数传递给单元方法体,但我不知道如何做到这一点。
    • 是的,因为它也尝试迭代“测量”属性,这就是它不适用于系统和栏的原因。他们有不同的路径。我为大多数列添加了可重复使用的功能。这两个需要其他功能。好吧,system 需要例如一个稍小的函数。 (在这种情况下,renderJson 函数不需要测量)
    • 例如对于system,您可以编写一个if 语句if (property !== 'systemName') { flat = flat.map(md =&gt; md.measurements); flat = [].concat(...flat); },然后就可以了。 systemName 也被处理。 bar 是另一个故事,但我想你已经有一个饼图,MyCell 之类的。
    • 检查我更新的沙箱codesandbox.io/s/keen-bush-yk66n
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2019-12-27
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2021-06-10
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多