Vue Quasar q-table 用于数组中的多个数组

Vue Quasar q-table for multiples arrays in array

我目前正在尝试根据 API 的响应显示具有动态列数的 table。

这是我的 API 响应示例(dataExportColumnsTagList 中的元素数量可以从 1 到很多不等......对于这个例子我放了 3 个元素):

allData:[
{
  "id": 167831,
  "tag": "House1",
  "timestamp": "2020-12-17T00:00:00",
  "dataExportColumnsTagList": [
    {
      "element_tag": "PROD_ELEMENT",
      "display_unit_tag": "Gram",
      "value": 23,
      "index": 1
    },
    {
      "element_tag": "PROD_A",
      "display_unit_tag": "Day",
      "value": 5,
      "index": 0
    },
    {
      "element_tag": "PROD_T",
      "display_unit_tag": "Degree Celsius",
      "value": 25,
      "index": 0
    }
  ]
},
{
  "id": 167834,
  "tag": "House1",
  "timestamp": "2020-12-17T03:10:19",
  "dataExportColumnsTagList": [
    {
      "element_tag": "PROD_ELEMENT",
      "display_unit_tag": "Gram",
      "value": 22,
      "index": 1
    },
    {
      "element_tag": "PROD_A",
      "display_unit_tag": "Day",
      "value": 5,
      "index": 0
    },
    {
      "element_tag": "PROD_T",
      "display_unit_tag": "Degree Celsius",
      "value": 24,
      "index": 0
    }
  ]
}
]

我希望 table 的格式如下:

timestamp tag PROD_ELEMENT (Gram) Index PROD_A (Day) Index PROD_T (D Celsius) Index
2020-12-17 00:00:00 House1 23 1 5 0 25 0
2020-12-17 03:10:19 House1 22 1 5 0 24 0

我无法遍历重复的元素 (dataExportColumnsTagList)...

这是我现在的代码:

<template>
  <q-table style="margin-top: 16px"
    class="q-mb-sm q-ml-sm"
    :data="allData"
    :columns="columns"
    :pagination.sync="pagination"
    row-key="id"
  >
    <template v-slot:body="props">
      <q-tr :props="props">
        <q-td key="timestamp" :props="props">
            {{ props.row.timestamp.replace('T', ' ') }}
        </q-td>
        <q-td key="datasite_tag" :props="props">
          {{ props.row.datasite_tag }}
        </q-td>

        <q-td :props="props" v-for="dataExportColumnst in allData[id].dataExportColumnsTagList" :key="dataExportColumnst.datapoint_descriptor_tag">
          {{ dataExportColumnst.value }}
        </q-td>
        <q-td key="index" :props="props">
            {{ props.row.index }}
        </q-td>
      </q-tr>
    </template>
    <template v-slot:top-right>
      <q-btn
        color="primary"
        icon-right="archive"
        label="Export to csv"
        no-caps
        @click="exportTable"
      />
    </template>
  </q-table>
</template>

我在这里的回答让我很困扰,所以这里是你要找的答案。

我确实需要修改列,因为我不知道你的列是如何设置的。

注意: 在 Vue 3 中,Quasar 将 data 属性 更改为 rowspagination.sync 更改为 v-model:paginationLink

<template>
    <q-table 
        style="margin-top: 16px"
        class="q-mb-sm q-ml-sm"
        :data="allData"
        :columns="columns"
        :pagination.sync="pagination"
        row-key="id"
    >
        <template v-slot:body="props">
            <q-tr :props="props">
                <q-td key="timestamp" :props="props">
                    {{ props.row.timestamp.replace('T', ' ') }}
                </q-td>
                <q-td key="tag" :props="props">
                    {{ props.row.tag }}
                </q-td>
                

                <template v-for="row in props.row.dataExportColumnsTagList">
                    <q-td :props="props" :key="row.element_tag">
                        {{ row.value }}
                    </q-td>
                    <q-td :key="`${row.element_tag}_INDEX`" :props="props">
                        {{ row.index }}
                    </q-td>
                </template>
            </q-tr>
        </template>

        <template v-slot:top-right>
            <q-btn
                color="primary"
                icon-right="archive"
                label="Export to csv"
                no-caps
                @click="exportTable"
             />
        </template>
    </q-table>
</template>

<script>
export default {
    data() {
        return {
            columns: [
                {
                    label: 'timestamp',
                    name: 'timestamp',
                    field: 'timestamp',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'tag',
                    name: 'tag',
                    field: 'tag',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'PROD_ELEMENT (gram)',
                    name: 'PROD_ELEMENT',
                    field: 'PROD_ELEMENT',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'PROD_ELEMENT_INDEX',
                    name: 'PROD_ELEMENT_INDEX',
                    field: 'PROD_ELEMENT_INDEX',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'PROD_A (Day)',
                    name: 'PROD_A',
                    field: 'PROD_A',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'PROD_A Index',
                    name: 'PROD_A_INDEX',
                    field: 'PROD_A_INDEX',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'PROD_T (D Celsius)',
                    name: 'PROD_T',
                    field: 'PROD_T',
                    align: 'center',
                    sortable: true,
                },
                {
                    label: 'PROD_T Index',
                    name: 'PROD_T_INDEX',
                    field: 'PROD_T_INDEX',
                    align: 'center',
                    sortable: true,
                },
            ],
            allData: [
                {
                    id: 167831,
                    tag: 'House1',
                    timestamp: '2020-12-17T00:00:00',
                    dataExportColumnsTagList: [
                        {
                            element_tag: 'PROD_ELEMENT',
                            display_unit_tag: 'Gram',
                            value: 23,
                            index: 1,
                        },
                        {
                            element_tag: 'PROD_A',
                            display_unit_tag: 'Day',
                            value: 5,
                            index: 0,
                        },
                        {
                            element_tag: 'PROD_T',
                            display_unit_tag: 'Degree Celsius',
                            value: 25,
                            index: 0,
                        },
                    ],
                },
                {
                    id: 167834,
                    tag: 'House1',
                    timestamp: '2020-12-17T03:10:19',
                    dataExportColumnsTagList: [
                        {
                            element_tag: 'PROD_ELEMENT',
                            display_unit_tag: 'Gram',
                            value: 22,
                            index: 1,
                        },
                        {
                            element_tag: 'PROD_A',
                            display_unit_tag: 'Day',
                            value: 5,
                            index: 0,
                        },
                        {
                            element_tag: 'PROD_T',
                            display_unit_tag: 'Degree Celsius',
                            value: 24,
                            index: 0,
                        },
                    ],
                },
            ],
        };
    },
}
</script>