transition-group列表动画

transition 标签只能让单个元素添加动画效果,大多数情况下,列表用得比较多,如 li 列表,这里就要用到列表动画 transition-group。

案例需求:在文本框中添加内容,单击 “添加” 按钮,增加列表动画,效果如图 4-3 所示。

image 2025 02 11 12 53 44 967
Figure 1. 图4-3 列表动画案例效果图

需求描述如下。

  • 使用 v-for 渲染 li 列表。

  • 初次进入页面时,li 列表从下往上过渡。

  • 可新增数据,并且新增的数据从下往上过渡。

CSS 过渡代码如下。

<style>
    .v-enter,
    .v-leave-to {
        opacity: 0;
        transform: translateY(100px);
    }

    .v-enter-active,
    .v-leave-active {
        transition: all 1s ease;
    }
</style>

视图层代码如下。

<div id="main" v-cloak>
    <transition-group appear tag="ul">
        <li v-for="item in list" :key="item.id">
            {{item.id}}---{{item.name}}---{{item.age}}
        </li>
    </transition-group>
    <input type="text" placeholder="id" v-model="id" />
    <input type="text" placeholder="name" v-model="name" />
    <input type="text" placeholder="age" v-model="age" />
    <input type="button" value="添加" @click="add" />
</div>

视图层代码如下。

<script>
    var app = new Vue({
        el: '#main',
        data: {
            id: '',
            name: '',
            age: '',
            list: [
                { id: 1, name: '小明', age: 18 },
                { id: 2, name: '小红', age: 19 },
                { id: 3, name: '小刚', age: 18 }
            ]
        },
        methods: {
            add: function () {
                // 分别获取文本框值
                // 组织新对象
                // 使用push方法
                var newstu = {
                    id: this.id,
                    name: this.name,
                    age: this.age
                };
                this.list.push(newstu);

                // 清空输入框
                this.id = '';
                this.name = '';
                this.age = '';
            }
        }
    });
</script>

代码解析如下。

  • 对于需要添加动画的列表,使用 transition-group 标签包裹。

  • 添加两组 CSS 样式。

  • tag="ul" 表示 transition-group 会渲染成一个 ul 标签。

  • apper 表示给列表添加入场动画。