@AfterGen

В чем причина некорректной transition-анимации при смене позиций двух элементов массива на Vue?

Например, есть кнопка, которая меняет местами пару элементов в массиве, живой пример здесь . Но transition срабатывает только на левом элементе. А требуется анимировать переходы обоих одновременно
<template>
    <div
        v-for="(item, index) in data"
        :key="item.id"
        class="block"
        :style="`left: ${80 * index}px; top: 0px`"
    >
        {{ item.id }}
    </div>

    <button @click="swap" style="position: absolute; top: 80px;">SWAP</button>
</template>

<script setup>
import { ref } from 'vue'

const data = ref([{ id: 0 }, { id: 1 }])

function swap() {
    ;[data.value[0], data.value[1]] = [data.value[1], data.value[0]]
}
</script>

<style>
.block {
    transition: left ease-out 1s;
    position: absolute;
    width: 80px;
    height: 80px;
    border: 1px solid black;
}
</style>
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
Wispik
@Wispik
У тебя блоки перерисовываются, поэтому у левого всегда left: 0 и анимации нет
Надо либо, добавить элементам параметр позиции:
const data = ref([{ id: 0, pos: 0 }, { id: 1, pos: 1 }])

задавать left относительно позиции:
:style="`left: ${80 * item.pos}px; top: 0px`"
ну и менять тогда так:
function swap() {
    data.value.forEach(el => {
        el.pos = el.pos === 1 ? 0 : 1
    })
}


Либо, лучше для этого лучше использовать transition-group
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
15 нояб. 2024, в 23:33
20000 руб./за проект
15 нояб. 2024, в 23:11
1000 руб./за проект
15 нояб. 2024, в 23:07
8000 руб./за проект