• vue3学习记录之内置组件TransitionGroup基于状态变化的过渡和动画



    前言

    本文参考vue3

    Vue 提供了两个内置组件,可以帮助我们制作基于状态变化的过渡和动画

    • 会在一个元素或组件进入和离开 DOM 时应用动画。

    • 会在一个 v-for 列表中的元素或组件被插入,移动,或移除时应用动画。


    说明

    是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。

    进入 / 离开动画

    <template>
      <button @click="add">新增button>
      <TransitionGroup name="list" tag="ul">
        <li v-for="item in items" :key="item">
          {{ item }}
        li>
      TransitionGroup>
    template>
    
    <script setup>
    import { reactive, ref } from "vue";
    const items = reactive([])
    const add = () => items.push(Math.random())
    script>
    
    <style scoped>
    .list-enter-active,
    .list-leave-active {
      transition: all 0.5s ease;
    }
    .list-enter-from,
    .list-leave-to {
      opacity: 0;
      transform: translateX(30px);
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    移动动画

    优化进入 / 离开动画效果

    <template>
      <button @click="add">新增button>
      <TransitionGroup name="list" tag="ul">
        <li v-for="item in items" :key="item">
          {{ item }}
        li>
      TransitionGroup>
    template>
    
    <script setup>
    import { reactive, ref } from "vue";
    const items = reactive([])
    const add = () => items.push(Math.random())
    script>
    
    <style scoped>
    .list-move, /* 对移动中的元素应用的过渡 */
    .list-enter-active,
    .list-leave-active {
      transition: all 0.5s ease;
    }
    
    .list-enter-from,
    .list-leave-to {
      opacity: 0;
      transform: translateX(30px);
    }
    
    /* 确保将离开的元素从布局流中删除
      以便能够正确地计算移动的动画。 */
    .list-leave-active {
      position: absolute;
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    渐进延迟列表动画

    <script>
    import gsap from "gsap";
    
    const list = [
      { msg: "Bruce Lee" },
      { msg: "Jackie Chan" },
      { msg: "Chuck Norris" },
      { msg: "Jet Li" },
      { msg: "Kung Fury" },
    ];
    
    export default {
      data() {
        return {
          query: "",
        };
      },
      computed: {
        computedList() {
          return list.filter((item) => item.msg.toLowerCase().includes(this.query));
        },
      },
      methods: {
        onBeforeEnter(el) {
          el.style.opacity = 0;
          el.style.height = 0;
        },
        onEnter(el, done) {
          gsap.to(el, {
            opacity: 1,
            height: "1.6em",
            delay: el.dataset.index * 0.15,
            onComplete: done,
          });
        },
        onLeave(el, done) {
          gsap.to(el, {
            opacity: 0,
            height: 0,
            delay: el.dataset.index * 0.15,
            onComplete: done,
          });
        },
      },
    };
    script>
    
    <template>
      <input v-model="query" />
      <TransitionGroup
        tag="ul"
        :css="false"
        @before-enter="onBeforeEnter"
        @enter="onEnter"
        @leave="onLeave"
      >
        <li
          v-for="(item, index) in computedList"
          :key="item.msg"
          :data-index="index"
        >
          {{ item.msg }}
        li>
      TransitionGroup>
    template>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    的区别

    支持和 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器,但有以下几点区别:

    默认情况下,它不会渲染一个容器元素。但你可以通过传入 tag prop 来指定一个元素作为容器元素来渲染。

    过渡模式在这里不可用,因为我们不再是在互斥的元素之间进行切换。

    列表中的每个元素都必须有一个独一无二的 key attribute。

    CSS 过渡 class 会被应用在列表内的元素上,而不是容器元素上。

    当在DOM内模板中使用时,组件名需要写为

  • 相关阅读:
    redis(1)NoSQL数据库简介
    数据库练习丽丽
    uniapp——实现二维码生成+保存二维码图片——基础积累
    ts重点学习38-可选属性和只读属性笔记
    mac apktool安装
    互联网时代下的品牌传播怎么做
    kafka 3.5 kafka服务端接收生产者发送的数据源码
    Java 在Word文档中添加艺术字
    【摆脱他人眼光的束缚】如何重视自我感受,做好自己
    使用aggird组件实现下滑请求分页从而实现无限滚动的效果
  • 原文地址:https://blog.csdn.net/weiCong_Ling/article/details/134464695