Сценарий выглядит следующим образом ...
Шаблон компонента
<template>
<div>
<loader v-show="loading"></loader> // loading animation
<div v-show="!loading">
<div v-for="group in groups">
{{group.name}}
<div v-for="item in group.list">
{{item.name}}
</div>
</div>
</div>
</div>
</template>
Данные компонента
data: function () {
return {
list: [],
groups: [],
loading: true
}
}
1. получить одномерный массив из API
axios.get(API_URL).then(
(response) => {
this.list = response.data.payload;
}
);
Структура массива следующая ...
[
{
"name": "bob",
"group": "A"
},
{
"name": "sally",
"group": "A"
},
{
"name": "john",
"group": "B"
},
{
"name": "jane",
"group": "B"
},
]
2. преобразовать массив в 2 измерения, используя свойство группы каждого элемента
текущее решение ( блокировка! , неэффективно? )
// loading animation stops at this point
this.list.forEach((item, index) => {
let hasGroupChanged = false;
if (index === 0) {
hasGroupChanged = true;
} else {
let currentGroupName = item.group;
let previousGroupName = this.list[index - 1].group;
hasGroupChanged = previousGroupName !== currentGroupName;
}
if (hasGroupChanged) {
const group = {
group: item.group,
list: []
};
this.groups.push(group);
}
const groupIndex = this.groups.length - 1;
this.groups[groupIndex].list.push(item);
});
this.loading = false;
как сохранить анимацию загрузки до заполнения групп?