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
属性 更改为 rows
,pagination.sync
更改为 v-model:pagination
。Link
<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>
我目前正在尝试根据 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
属性 更改为 rows
,pagination.sync
更改为 v-model:pagination
。Link
<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>