0

我在将一些 JSON 数据渲染到 React 表(来自库 react-table)时遇到了一些问题。这是我正在使用的 json 示例:

const translateditems = [
  {
    id: 1,
    colonne1: [
      {
        language: 'en',
        content: 'Column n°1'
      },
      {
        language: 'fr',
        content: 'Colonne n°1'
      }
    ],
    colonne2: [
      {
        language: 'en',
        content: 'Column n°2'
      },
      {
        language: 'fr',
        content: 'Colonne n°2'
      }
    ],
    dateCreated: '2018 - 02 - 01 30: 00: 00.000'
  }
]

对于选择的语言,如果需要,我只需要显示每列翻译文本的一个对象。(在本例中,日期不需要翻译成任何特定语言)

这是我渲染我的 react-table 的方式:

constructor () {
    super()
    this.state = {
      data: translateditems
    }
  }

  render () {
    const { data } = this.state
    const headers = []
    // I use all the name fields in the first json object as headers
    for (var key in Object.keys(data[0])) {
      headers.push(Object({
        'content': Object.keys(data[0])[key]
      }))
    }

    return (
      <div>
        <ReactTable
          data={data}
          columns={headers.map(header => {
            return ({
              Header: header.content,
              accessor: header.content
            })
          })
        }
          defaultPageSize={10}
          className='-striped -highlight'
        />
        <br />
      </div>
    )
  }

你对如何做到这一点有任何线索吗?

更新

这是我为解决问题所做的工作:

return (
      <div>
        <ReactTable
          data={data}
          columns={headers.map(header => {
            return ({
              Header: header.content,
              accessor: header.content,
              // I added a function to apply on my Cell
              Cell: row => (
                <div>{this.renderTranslatedItem(data, header.content, row.index)}</div>
              )
            })
          })
          }
          defaultPageSize={10}
          className='-striped -highlight'
        />
        <br />
      </div>
    )

这是我制作的功能(假设 lang 是我想要的语言):

renderTranslatedItem (data, column, rowIndex) {
    // I check if the value is an array -> if it's not, then I return null
    if (Object.prototype.toString.call(data[rowIndex][column]) !== '[object Array]') {
      return null;
    }
    for (var i in data[rowIndex][column]) {
      if (data[rowIndex][column][i].language === lang) {
        return data[rowIndex][column][i].content
      }
    }
  }
4

1 回答 1

0
    for (var key in Object.keys(data[0])) {
    const headers = []
    // I use all the name fields in the first json object as headers
  headers.push(Object({
        'content': Object.keys(data[0])[key]
      }))
    }

在我的示例中,我认为 lang 是通过您的道具传递的。您必须将其替换为:

const { lang } = this.props
const headers = Object.keys(data[0]).reduce(
    (acc, key)=> {
        return key!=='id' && key!=='dateCreated' && data[0][key][lang]
        ? { ...acc, [key] : data[0][key][lang] }
        : { ...acc, [key]:null }
},{})


//console.log(headers) will output this:
{
    colonne1:'colonne1',
    colonne2:'colonne2'
}
于 2018-03-13T18:22:30.460 回答