React@16.x(34)动画(中)

目录

  • 3,SwitchTransition
    • 3.1,原理
      • 3.1.2,key
      • 3.1.2,mode
    • 3.2,举例
    • 3.3,结合 animate.css
  • 4,TransitionGroup
    • 4.1,其他属性
      • 4.1.2,appear
      • 4.1.2,component
      • 4.1.3,classNames

接上面文章 React动画(上)

3,SwitchTransition

官方文档

在上篇文章中,用 CSSTransition 做了一个动画:

在这里插入图片描述

可以看到,这2个元素的动画是同时发生的,因为使用同一个状态变量控制的(代码参考上篇文章)

SwitchTransition 组件是专门用来做切换动画的,并且2个元素的动画是有先后顺序的。

元素1完成退出动画后,元素2再开始进入动画。

3.1,原理

默认情况下(mode="out-in"),通过改变状态变量来改变 key 值,才能开始切换动画,

key 属性替换了之前的 in 属性。

如果默认 state=true,渲染元素1,则切换状态时的动画过程:

  1. 先给元素1添加类名 exit exit-active,元素1执行退出动画。
  2. 等元素1的退出动画完成(过渡时间结束),再给元素2添加类名 enter enter-active 执行进入动画。
  3. 等元素2的进入动画完成,类名切换为 enter-done

所以,只需要设置这5个类名对应的样式即可。

如果进入动画结束后,用的默认样式(比如: opacity: 1)那类名 enter-done 也不用设置。

3.1.2,key

因为会将退出动画和进入动画对应的类名,设置到对应的元素上,来实现切换动画。

所以如果不设置,那所有的类名会加到同一个元素上,结果是该元素无限进入循环动画(退出-进入-退出…)

key 只要保证唯一,能区分为2个元素即可。

3.1.2,mode

默认 out-in,具体动画过程上面已经介绍了。

in-out,如果默认 state=true,渲染元素1,则切换状态时的动画过程:

  1. 保持元素1不变,为元素2添加enter enter-active 执行进入动画。
  2. 过渡时间结束,元素2的类名变为 enter-done,同时为元素1添加类名 exit exit-active,开始退出动画。
  3. 过渡时间结束,元素1被移除。

相当于先执行了一次元素2的进入动画,之后再开始执行元素1的退出动画。

3.2,举例

import { CSSTransition, SwitchTransition } from "react-transition-group";
import { useRef, useState } from "react";
import "./App.css";

export default function App() {
    const [state, setState] = useState(true);
    return (
        <SwitchTransition>
            <CSSTransition key={state} timeout={500}>
                <button onClick={() => setState(!state)}>{state ? "状态1" : "状态2"}</button>
            </CSSTransition>
        </SwitchTransition>
    );
}
/* App.css */
.enter {
    opacity: 0;
}
.enter-active {
    opacity: 1;
    transition: opacity 1s;
}

.exit {
    opacity: 1;
}
.exit-active {
    opacity: 0;
    transition: opacity 1s;
}

效果:

在这里插入图片描述

同样的,要在过渡完成后执行 transitionend 事件,可以:

export default function App() {
    const [state, setState] = useState(true);
    const refBtn1 = useRef(null);
    const refBtn2 = useRef(null);
    const nodeRef = state ? refBtn1 : refBtn2;
    return (
        <SwitchTransition>
            <CSSTransition
                key={state}
                timeout={1000}
                nodeRef={nodeRef}
                addEndListener={() => {
                    nodeRef.current.addEventListener(
                        "transitionend",
                        () => {
                            console.log("过渡结束");
                        },
                        { once: true }
                    );
                }}
            >
                <button ref={nodeRef} onClick={() => setState((state) => !state)}>
                    {state ? "状态1" : "状态2"}
                </button>
            </CSSTransition>
        </SwitchTransition>
    );
}

3.3,结合 animate.css

animate 样式举例1,animate 样式举例2

安装:

npm install animate.css -S

样例完整代码:

import { CSSTransition, SwitchTransition } from "react-transition-group";
import { useState } from "react";
import "animate.css";

export default function App() {
    const [state, setState] = useState(true);
    return (
        <SwitchTransition>
            <CSSTransition
                key={state}
                timeout={1000}
                classNames={{
                    appearActive: "animate__fadeInRight",
                    enterActive: "animate__fadeInRight",
                    exitActive: "animate__fadeOutLeft",
                }}
            >
                <button className="animate__animated" onClick={() => setState(!state)}>
                    {state ? "状态1" : "状态2"}
                </button>
            </CSSTransition>
        </SwitchTransition>
    );
}

效果:

在这里插入图片描述

4,TransitionGroup

官方文档

它接收一组 CSSTransitionTransition,统一控制它们的进入和退出动画。

SwitchTransition 一样,会添加对应的类名来实现动画。

经典例子:待办列表,可以动态新增或删除待办项,同时为每一项都应用动画。

import { TransitionGroup, CSSTransition } from "react-transition-group";
import { useState } from "react";
import { v4 as uuidv4 } from "uuid";
import "./App.css";

export default function App() {
    const [todoList, setTodoList] = useState([
        { id: uuidv4(), content: "学习" },
        { id: uuidv4(), content: "吃饭" },
        { id: uuidv4(), content: "睡觉" },
    ]);
    return (
        <>
            <TransitionGroup>
                {todoList.map((item) => (
                    <CSSTransition key={item.id} timeout={500}>
                        <div>
                            <span>{item.content}</span>
                            <button
                                onClick={() => {
                                    const resultItem = todoList.filter((f) => f.id !== item.id);
                                    setTodoList(resultItem);
                                }}
                            >
                                删除
                            </button>
                        </div>
                    </CSSTransition>
                ))}
            </TransitionGroup>
            <button
                onClick={() => {
                    const answer = window.prompt();
                    setTodoList([
                        ...todoList,
                        {
                            id: uuidv4(),
                            content: answer,
                        },
                    ]);
                }}
            >
                新增
            </button>
        </>
    );
}

4.1,其他属性

4.1.2,appear

统一添加加载动画,同时会有 appearappear-activeappear-done 类名。

4.1.2,component

控制渲染的容器的节点类名,默认 divnull 表示不渲染节点。

<TransitionGroup appear component="ul">

4.1.3,classNames

component 对应节点的类名,不是动画类名前缀。

动画类名前缀,还是要添加到 CSSTransition 组件上。


以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/724477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JWT整合Gateway实现鉴权(RSA与公私密钥工具类)

一.业务流程 1.使用RSA生成公钥和私钥。私钥保存在授权中心&#xff0c;公钥保存在网关(gateway)和各个信任微服务中。 2.用户请求登录。 3.授权中心进行校验&#xff0c;通过后使用私钥对JWT进行签名加密。并将JWT返回给用户 4.用户携带JWT访问 5.gateway直接通过公钥解密JWT进…

深圳中小企业融资攻略,贷款方法大盘点!

中小企业融资这事&#xff0c;可不是一个简单的事情。资金对中小企业来说&#xff0c;就像血液对人体一样重要。企业发展离不开资金支持&#xff0c;特别是在今年这个环境下&#xff0c;政策对中小企业还挺友好的。今天讲解一下中小微企业常用的几种贷款方法。希望能让大家更明…

MySQL之复制(五)

复制 复制的原理 复制文件 3.master.info 这个文件用于保存备库连接到主库所需要的信息&#xff0c;格式为纯文本(每行一个值)&#xff0c;不同的MySQL版本&#xff0c;其记录的信息也可能不同。此文件不能删除&#xff0c;否则备库在重启后无法连接到主库。这个文件以文本的…

Java面试八股之myBatis中#{}和${}标识的区别是什么

myBatis中#{}和${}标识的区别是什么 MyBatis中的#{}和${}都是用来动态地向SQL语句中插入参数的&#xff0c;但它们之间存在几个关键的区别&#xff1a; 预编译与字符串替换&#xff1a; #{}是预编译处理的参数占位符。MyBatis会将#{}中的内容替换为一个预编译语句的参数标记…

[Linux] 其他命令

cat cat是用法极多的一个命令&#xff1a; 1.输入输出 如果不加任何修饰&#xff0c;只一个cat&#xff0c;它是&#xff1a; 标准输入设备&#xff08;键盘&#xff09;——》标准输出设备&#xff08;显示器&#xff09; 显示文件内容&#xff1a; cat filename 输入重定向&a…

在金仓数据库中导入sql文件,解决中文数据乱码问题

先确定数据库服务端编码方式是UTF8&#xff0c;如果不是&#xff0c;那就先解决这个问题。操作&#xff1a;当连接数据库之后&#xff0c;执行show server_encoding 用Notepad打开&#xff0c;目的&#xff1a;确定文件编码是UTF-8格式 在sql文件前面加上set NAMES utf8; …

为什么要进行数据库设计?

本文介绍数据库设计的定义、知识要求和设计的内容。 01、数据库设计的定义和知识要求 数据库设计是指对于一个给定的应用环境,根据用户的需求,在某一具体的数据库管理系统上,构造一个性能良好的数据模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的信…

【宠粉赠书】科技图表绘制:R语言数据可视化

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套科研绘图的必备书籍——《R语言数据可视化&#xff1a;科技图表绘制》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《R语言数据可视化&#xff1a;科技图表绘制》结合编者多年的数据分析…

TVS的原理及选型

目录 案例描述 TVS管的功能与作用&#xff1a; TVS选型注意事项&#xff1a; 高速TVS管选型 最近项目中遇到TVS管选型错误的问题。在此对TVS的功能及选型做一个分享。 案例描述 项目中保护指标应为4-14V&#xff0c;而选型的TVS管位SMJ40CA&#xff0c;其保护电压为40V未…

全新防关联技术出炉:亚马逊测评环境优化,下单成功率大提升

在竞争激烈的测评行业中&#xff0c;构建一个稳定且高效的环境系统成为了制胜的关键。然而&#xff0c;市场上现有的环境方案如虚拟机、模拟机、GCS、云手机、VPS等不仅成本高昂&#xff0c;而且面临着在风控严格的平台上如亚马逊难以逃脱检测的挑战&#xff0c;进而影响了测评…

从视频创意到传播策略 | 医药产品TVC新媒体传播方案

作为营销策划人&#xff0c;你一定在寻找能够激发创意灵感、拓展策划视野的实战案例。这份最新传播方案由Unithought精心打造&#xff0c;不仅是一份详尽的策划指南&#xff0c;更是一次深入患者心灵的品牌传播实践。 何策网&#xff0c;每日收录全网方案PPT &#xff01; 方…

WDC西部数据闪存业务救赎之路,会成功吗?

一、序言 在存储界的江湖里&#xff0c;WDC就像是一位手握两大秘籍&#xff08;闪迪和铠侠NAND工厂&#xff09;的武林高手&#xff0c;本以为能在企业级SSD的擂台上大展身手&#xff0c;结果却发现自己更像是被误邀参加学霸聚会的学渣&#xff0c;心里那个苦啊&#xff0c;只…

git 拉下来的项目,出现“加载失败”的解决方法

现象&#xff1a; 1、对加载失败的项目&#xff0c;尝试重新加载 解决思路&#xff1a;根据上面的提示&#xff0c;打开F盘对应的 .vcxproj文件&#xff0c;查看里面关于opencv454.props的内容 先删了&#xff0c;后面再补 2、当前的工作重点是消除加载失败的情况&#xff0c;…

JAVA每日作业day6.19

ok了家人们今天继续学习面向对象&#xff0c;话不多说看看今天学了什么 一.面向对象-封装 1&#xff0c;private private:私有的 权限修饰符 是一个成员修饰符&#xff0c;修饰成员变量 被private修饰的成员变量和成员方法只能在本类中使用 对外访问使用是 set XXX 和 get X…

对于补码的个人理解

1. 十进制的取模计算 现在我想要使另一个数加上2后用8取模后也等于1&#xff0c;这个数可以是哪些&#xff1f; 这个问题比较简单&#xff0c;只需要-1加上8的倍数即可 例如&#xff1a; 如果我们想要得到距离-1这个负数最近的一个正数7&#xff0c;直接使用-18即可。反过来想…

微信小程序-上拉加载和下拉刷新

一.上拉加载 微信小程序的上拉加载使用onReachBottom()&#xff0c;写在.js文件里面的Page方法里面。 onReachBottom(){//上拉自动更新到4&#xff0c;5&#xff0c;6wx.showLoading({title: 数据加载中...,})setTimeout(()>{const lastNumthis.data.numList[this.data.nu…

JavaScript事件传播实战

上篇文章我们学习了事件传播的冒泡和捕获两种类型&#xff0c;现在我们在实际项目中演示一下&#xff1b; ● 首先我们先定义一个随机数 const randomInt (min, max) > Math.floor(Math.random() * (max - min 1) min);● 接着&#xff0c;我们使用随机数来创建随机的r…

移植案例与原理 - HDF驱动框架-驱动配置(2)

1.2.7 节点复制 节点复制可以实现在节点定义时从另一个节点先复制内容&#xff0c;用于定义内容相似的节点。语法如下&#xff0c;表示在定义"node"节点时将另一个节点"source_node"的属性复制过来。 node : source_node示例如下&#xff0c;编译后bar节点…

[15] 使用Opencv_CUDA 模块实现基本计算机视觉程序

使用Opencv_CUDA 模块实现基本计算机视觉程序 CUDA提供了出色的接口&#xff0c;发挥GPU的并行计算能力来加速复杂的计算应用程序利用CUDA和Opencv的功能实现计算机视觉应用 1. 对图像的算术和逻辑运算 两个图像相加 #include <iostream> #include "opencv2/ope…

DIVE INTO DEEP LEARNING 36-49

文章目录 36. Data augmentation36.1 Training with enhanced data36.2 Enhancement measures36.3 Data augmentation summary 37. Fine tuning37.1 Fine tuning Introduce37.2 Fine tuning Step37.3 Fine tuning summary 38. Object detection38.1 Object detection38.2 Edge …