У меня есть список форм в шаблоне одной страницы Vue. Шаблон загружает содержимое в виде массивов асинхронно, которые затем повторяются для создания форм. список является потомком <transition-group>
. Каждая форма имеет кнопку вверх / вниз, позволяющую им перемещаться вверх и вниз по списку; при нажатии вверх / вниз форма выше / ниже меняет местами щелчкованную форму с использованием анимации перехода.
Анимация списка абсолютно прекрасна, когда страница загружается с асинхронным содержимым во время ловушки шаблона created()
.
Однако, когда список пуст во время created()
или когда все формы в списке удалены, а затем добавлена новая форма, анимация заказа перестает работать. Больше ничего не ломается, вся реактивность и т. Д. Полностью в порядке. Учитывая ниже, есть ли решение этой ошибки?
Я постараюсь предоставить краткую заглушку, которая будет ниже, если она будет полезна:
[HTML]
<template>
...
<transition-group v-if="sections.length"
name="flip-list"
tag="div">
<div v-for="(section, i) in sortedOrder"
:key="sortedOrder[i].id>
<div>
<button @click.prevent="decrementOrder(section.order, i)">
<i class="fas fa-chevron-up"></i>
</button>
<button @click.prevent="incrementOrder(section.order, i)">
<i class="fas fa-chevron-down"></i>
</button>
... FORM FIELDS ETC ...
</div>
</div>
</transition-group>
...
</template>
[JS]
computed: {
sortedOrder () {
let sorted = this.sections
return sorted.sort((a, b) => { return a.order - b.order })
}
},
methods: {
...
addSection () {
let newSection = {
id: -1,
order: this.sections.length,
...
}
let i = this.sections.push(newSection) - 1
...
},
deleteSection (id) {
let wasSpliced = 0
this.sections.forEach(function (section, i) {
if (section.id === id) {
this.sections.splice(i, 1)
if (this.sections.length && this.sections.length > i) {
--this.sections[i].order
}
wasSpliced = 1
} else if (wasSpliced) {
--this.sections[i].order
}
}.bind(this))
},
decrementOrder (order, i) {
if (order > 0) {
this.sections.forEach((it, j) => {
if (it.order + 1 === order) {
++this.sections[j].order
--this.sections[i].order
}
})
}
},
incrementOrder (order, i) {
if (order <= this.sections.length - 1) {
this.sections.forEach((it, j) => {
if (it.order - 1 === order) {
--this.sections[j].order
++this.sections[i].order
}
})
}
}
...
}
[CSS]
...css
.flip-list-move {
transition: transform 1s;
}