Vuetify에서 행 그룹화
21417 단어 vuevuetifyjavascripttable
주제를 조사하는 동안 그룹화에 대한 정보가 많지 않다는 것을 알았습니다. 물론 기본 그룹화 예제를 찾을 수 있지만 제 사용 사례에는 약간의 고급 기능이 필요했습니다.
작은 소개
제품 데이터가 있다고 가정합니다. 자체 비용과 수량은 날짜별로 구분됩니다. 예를 들어:
상품명
제품 코드
자기 비용
수량
처리 날짜
🍌 바나나
111222333
1.4
50
2021-09-09
🍌 바나나
111222333
1.2
20
2021-09-10
🍌 바나나
111222333
1.5
74
2021-09-11
🍎 사과
222111333
0.5
100
2021-09-09
🍎 사과
222111333
0.9
80
2021-09-10
🍉 수박
362272838
1.1
24
2021-09-10
🍉 수박
362272838
1
45
2021-09-11
🍉 수박
362272838
0.8
73
2021-09-12
매일 우리는 제품을 받고 있지만 비용과 수량은 다릅니다. 이를 분석하려면 이러한 상세한 데이터가 필요하지만 유사한 제품을 "접거나"그룹화하여 평균 자체 비용, 총 비용 및 총 수량과 같은 요약 정보를 얻을 수 있다면 좋을 것입니다.
따라서 이 경우 이전의 유사한 데이터를 요약하고 표시할 하나의 메타 또는 임시 행이 필요합니다.
되게 해봐...
다음과 같은 JavaScript 스니펫이 있다고 가정합니다.
fields: [
{value: 'product_name', text: 'Product name', sortable: true, groupable: true},
{value: 'product_code', text: 'Product code', sortable: true, groupable: true},
{value: 'quantity', text: 'Quantity', sortable: true, groupable: false},
{value: 'produced_at', text: 'Process date', sortable: false, groupable: false},
],
items: [
{
"product_name": "🍌 Banana",
"product_code": 111222333,
"Self cost": 1.4,
"Quantity": 50,
"produced_at": "2021-09-09"
},
{
"product_name": "🍌 Banana",
"product_code": 111222333,
"Self cost": 1.2,
"Quantity": 20,
"produced_at": "2021-09-10"
},
{
"product_name": "🍌 Banana",
"product_code": 111222333,
"Self cost": 1.5,
"Quantity": 74,
"produced_at": "2021-09-11"
},
{
"product_name": "🍎 Apple",
"product_code": 222111333,
"Self cost": 0.5,
"Quantity": 100,
"produced_at": "2021-09-09"
},
{
"product_name": "🍎 Apple",
"product_code": 222111333,
"Self cost": 0.9,
"Quantity": 80,
"produced_at": "2021-09-10"
},
{
"product_name": "🍉 Watermelon",
"product_code": 362272838,
"Self cost": 1.1,
"Quantity": 24,
"produced_at": "2021-09-10"
},
{
"product_name": "🍉 Watermelon",
"product_code": 362272838,
"Self cost": 1,
"Quantity": 45,
"produced_at": "2021-09-11"
},
{
"product_name": "🍉 Watermelon",
"product_code": 362272838,
"Self cost": 0.8,
"Quantity": 73,
"produced_at": "2021-09-12"
}
],
그리고 우리는 HTML에 위의 데이터를 제공합니다.
<v-app>
<v-data-table :headers="fields"
:items="items"
class="elevation-1 bordered"
group-by="product_code"
show-group-by>
...
</v-data-table>
</v-app>
그래서 우리는 다음과 같은 것을 얻습니다:
Ezgif.com-gif-maker GIF | Gfycat
Gfycat에서 Ezgif.com-gif-maker GIF를 보고 공유하세요
gfycat.com
멋지죠? 제품 이름과 제품 코드로 그룹화할 수 있을 뿐만 아니라 그룹화를 비활성화하여 모든 것을 한 눈에 볼 수 있습니다. 그러나 예를 들어 바나나, 사과, 수박의 평균 자체 비용을 계산하거나 수량을 합산하는 등 일부 열의 데이터를 요약하려는 경우에는 어떻게 해야 할까요?
Vuetify는 훌륭하고 잘 문서화된 API 을 제공합니다. 그룹화 사용자 지정을 위해 다음 매개 변수가 있는
group.summary
슬롯을 조사해야 합니다.{
group: string,
groupBy: string[],
isMobile: boolean,
items: any[],
headers: DataTableHeader[],
isOpen: boolean,
toggle: () => void
}
우리의 경우 위의 개체에서 배열을 분해하여
items
배열을 가져올 수 있습니다.<template #group.summary="{ items }">
<th class="totals">Totals:</th>
<th class="totals">{{ calculateTotals(items).total_quantity }}</th>
<th class="totals">{{ calculateTotals(items).average_self_cost }}</th>
<th class="totals"></th>
</template>
이제 여기에서 필요한 모든 데이터를 제어하고 필요에 따라 수정할 수 있습니다.
HTML의 최종 버전은 다음과 같습니다.
<v-app>
<v-data-table :headers="fields"
:items="items"
class="elevation-1 bordered"
group-by="product_code"
show-group-by>
<template #group.summary="{ items }">
<th class="totals">Totals:</th>
<th class="totals">{{ calculateTotals(items).total_quantity }}</th>
<th class="totals">{{ calculateTotals(items).average_self_cost }}</th>
<th class="totals"></th>
</template>
</v-data-table>
</v-app>
다음과 같이 표시됩니다.
출력-2021-10-05 23.58.43 GIF | Gfycat
Gfycat에서 Output-2021-10-05 23.58.43 GIF 시청 및 공유
gfycat.com
유사한 행을 최소화하여 "유일한"상품을 볼 수 있으며 요약 데이터를 한눈에 볼 수 있습니다. 이러한 요약 정보는 100-250행과 같은 큰 데이터 세트가 있을 때 매우 유용합니다.
개선 사항으로 수동으로 이 작업을 수행하고 훨씬 빠르게 통계 수치를 보는 대신 표시된 행에 대해 동일한 데이터를 한 번에 접는 토글을 추가할 수 있습니다.
이 기사가 마음에 들었고 새로운 것을 얻었기를 바랍니다.
각주
이것은 나의 첫 번째 기사이므로 엄격합니다. ✌🏻
모든 제안에 감사드립니다.
그리고 여기까지 읽어주셔서 감사합니다.
Reference
이 문제에 관하여(Vuetify에서 행 그룹화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dima2306/grouping-rows-in-vuetify-js-3ia8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)