React@16.x(33)动画(上)

目录

  • 1,Transition
    • 一些常用 props
      • 1,mountOnEnter
      • 2,unmountOnExit
      • 3,appear
  • 2,CSSTransition
    • 2.1,和 Transition 组件的区别
    • 2.2,举例
    • 2.3,常用 props
      • 2.3.1,classNames
      • 2.3.2,appear
    • 2.4,结合 animate.css

使用 react-transition-group 来实现动画。总共有4个动画组件,覆盖大多应用场景。

1,Transition

官方文档

过渡动画的原理,和 Vue的过渡动画 类似。分为2个阶段:

  1. 进入(enter)过渡动画,对应的状态有3个,
    1. 进入前的初始状态 default
    2. 动画进行中的状态 entering
    3. 进入后的结束状态 entered
  2. 退出(exit / leave)过渡动画,对应的状态也是3个,
    1. 退出前的初始状态 entered
    2. exiting
    3. exited

注意
进入前的初始状态和 exited 是一个状态。
退出前的初始状态和 entered 也是一个状态。

以一个渐入渐出动画举例,

.default {transition: opacity 2s ease-in-out;
}
.default, .exiting, .exited{opacity: 0;
}
.entering, .entered {opacity: 1;
}

官方文档的例子:

import { Transition } from "react-transition-group";
import { useRef, useState } from "react";// 过渡时间
const duration = 300;// 默认样式
const defaultStyle = {transition: `opacity ${duration}ms ease-in-out`,opacity: 0,
};// 过渡样式
const transitionStyles = {entering: { opacity: 1 },entered: { opacity: 1 },exiting: { opacity: 0 },exited: { opacity: 0 },
};/*** Transition.children 是一个函数,函数的返回值是要进行动画的元素。* 函数会随着过渡动画的进行而调用(进入动画会调用3次,对应3种状态),参数 state 就是当前过渡状态。* @param {in} boolean,动画开关。从 false-> true,开启进入动画,反之退出动画。* @returns*/
function Fade({ in: inProp }) {const nodeRef = useRef(null);return (<TransitionnodeRef={nodeRef}in={inProp}timeout={duration}addEndListener={() => {nodeRef.current.addEventListener("transitionend",() => {console.log("过渡结束");},{ once: true });}}>{(state) => (<divref={nodeRef}style={{...defaultStyle,...transitionStyles[state],}}>I'm a fade Transition!</div>)}</Transition>);
}export default function App() {const [visible, setVisible] = useState(true);return (<><buttononClick={() => {setVisible(!visible);}}>切换动画</button><Fade in={visible} /></>);
}

效果:

在这里插入图片描述

也可以不用内联样式,而用 class 来添加更多的样式:

<div className={state}>I'm a fade Transition!</div>

一些常用 props

1,mountOnEnter

延迟挂载。顾名思义,在进入动画开始前再加载要进行动画的元素。默认 false 立即加载。

比如,对渐入渐出动画来说,如果初始值 in={false},也就是说元素一开始是隐藏的。

  • 默认情况下 mountOnEnter={false} 元素依然会被挂载到 DOM 中,等待动画开始。
  • 如果设置 mountOnEntermountOnEnter={true} 则元素延迟挂载,一开始并不会挂载到DOM中,直到动画开始才挂载并进行动画。

2,unmountOnExit

顾名思义,在退出动画结果后,是否在DOM中直接卸载动画元素。默认 false 不卸载。

3,appear

默认情况下,在元素挂载阶段,如果 in={true} 则直接进入动画的最终状态,整个过程 Transition.children 只会调用一次,参数 state=entered

此时设置 appearappear={true},则进入动画会经历完整3个阶段,函数也会运行 3 次。

注意,Transition 组件中并没有提供 appear 这个状态,所以也无法设置改状态下的样式。所以只是函数会运行3次而已
如果想一开始就执行一次进入的过渡动画,得使用下面这个组件 CSSTransition

还有其他的一些属性不多介绍了,比如设置过渡动画结束后的回调函数等。用到时参考官方文档即可。

2,CSSTransition

官方文档

2.1,和 Transition 组件的区别

  1. CSSTransition 是在 Transition 的基础上实现的,可以理解为是它的增强版,同时继承了它的所有属性 props。
  2. Transition 只是提供了基础的进入和退出动画,并将过渡状态 state 暴露出来,通过它来设置样式。更复杂的动画需要用到 onEnter 等回调函数来实现。
    CSSTransition 是基于 CSS 的过渡动画组件,只需要为不同的过渡状态指定相应的类名(classNames),CSSTransition 会自动在适当的时机添加或删除这些类。
  3. CSSTransition* 能够实现加载动画

2.2,举例

import { CSSTransition } from "react-transition-group";
import { useState } from "react";
import "./App.css";export default function App() {const [inProp, setInProp] = useState(true);return (<div><CSSTransition in={inProp} timeout={200} classNames="crane"><div>classNames 是自定义类名前缀</div></CSSTransition><button type="button" onClick={() => setInProp(!inProp)}>进入/退出</button></div>);
}
.crane-enter {opacity: 0;
}
.crane-enter-active {opacity: 1;transition: opacity 200ms;
}
.crane-enter-done {opacity: 1;
}
.crane-exit {opacity: 1;
}
.crane-exit-active {opacity: 0;transition: opacity 200ms;
}.crane-exit-done {opacity: 0;
}

逻辑,动画效果和 Transition 组件差不多。同样的,进入和退出动画分别有3种状态,不过直接对应到类名上了:

  • 进入动画
    1. enter,动画开始前的初始化类名。
    2. enter-active,动画进行中的类名。
    3. enter-done,动画结束后的类名。
  • 退出动画
    1. exit
    2. exit-active
    3. exit-done
  • 还多了加载动画
    1. appear
    2. appear-active
    3. appear-done

2.3,常用 props

2.3.1,classNames

有2种情况:

  • 字符串,表示动画类名前缀(上面的例子已经演示了)。
  • 对象,设置状态对应的动画类名(所以可结合 animate.css 使用,下文有举例)。
classNames={{appear: 'my-appear',appearActive: 'my-active-appear',appearDone: 'my-done-appear',enter: 'my-enter',enterActive: 'my-active-enter',enterDone: 'my-done-enter',exit: 'my-exit',exitActive: 'my-active-exit',exitDone: 'my-done-exit',
}}

2.3.2,appear

Transition 组件的 appear 属性中,介绍了它没有对应的状态来设置样式。而 CSSTransition 组件是有的。

举例:(只包含关键代码)

<CSSTransition in={true} appear classNames="crane"></CSSTransition>
.crane-appear {transform: translateX(200px);
}
.crane-appear-active {transform: translateX(0);transition: transform 200ms;
}
.crane-appear-done {transform: translateX(0);
}

这样,在页面加载完成时(刷新页面后),就会执行上面的动画了。

2.4,结合 animate.css

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

安装:

npm install animate.css -S

样例完整代码:

import { CSSTransition } from "react-transition-group";
import { useRef, useState } from "react";
import "./App.css";
import "animate.css";function MyCSSTransition({ in: inProp, children }) {return (<div><CSSTransitionin={inProp}appearmountOnEntertimeout={1000}classNames={{appearActive: "animate__fadeInRight",enterActive: "animate__fadeInRight",exitActive: "animate__fadeOutLeft",exitDone: "exit-done",}}><div className="animate__animated common">{children}</div></CSSTransition></div>);
}export default function App() {const [inProp, setInProp] = useState(true);return (<div className="app-box"><MyCSSTransition in={inProp}><h1>组件1</h1></MyCSSTransition><MyCSSTransition in={!inProp}><h1>组件2</h1></MyCSSTransition><button type="button" onClick={() => setInProp(!inProp)}>进入/退出</button></div>);
}
/* App.css */
.app-box {position: relative;margin-left: 80px;padding-top: 100px;width: 200px;
}
.common {position: absolute;top: 0;
}.exit-done {display: none;
}

效果:

在这里插入图片描述

注意点:

1,在引入 animate.css 后,对要进行动画的元素的添加基础类名animate__animated,其他过渡动画添加 animate__动画类名即可。比如:

<h1 class="animate__animated animate__bounce">An animated element</h1>

2,classNames 属性的类名最终会添加到 ref={nodeRef} 的元素上。

3,因为 animate.css 中的类名都是过渡动画的类名,所以只需要设置 appearActiveenterActiveexitActive这3个进行中的状态类名+最终态类名即可。

4,注意也设置了 mountOnEnter 属性,这是为了让没有进行动画的元素先不加载,以免影响到进行加载动画 appearActive 的元素。

接下篇文章 React 动画(下)


以上。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE数字孪生学习笔记】 Apifox一体化接口测试平台

声明&#xff1a;部分内容来自于b站&#xff0c;知乎&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 Apifox接口测试 Apifox 是集 API 文档、API 调试、API Mock、API 自动…

C++初学者指南第一步---8.类型系统(基础)

C初学者指南第一步—8.类型系统&#xff08;基础&#xff09; 文章目录 C初学者指南第一步---8.类型系统&#xff08;基础&#xff09;1.用const声明常量2.类型别名3.类型推导 auto4.常量表达式&#xff1a;constexpr (C11) 1.用const声明常量 语法&#xff1a; Type const v…

[手机Linux PostmarketOS]一,1加6T真正的手机Linux系统

前面用Linux deploy软件安装了Linux系统在手机&#xff0c;实则不是真正的手机刷成了linux系统&#xff0c;而是通过Linux deploy软件在容器里安装了Linux系统&#xff0c;在使用方面会有诸多限制&#xff0c;并不能发挥Linux的真实强大之处&#xff0c;于是我又百度又谷歌(真不…

Docker(四)-Docker镜像

1.概念 镜像是一种轻量级的、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖 打包好形成一个可交付的运行环境(包括代码&#xff0c;运行时需要的库&#xff0c;环境变量和配置文件等)&#xff0c;这个打包好的运行环境…

【Java】三种实现网络通讯的方式以及相关协议的使用示例

Java网络 - 应用篇 &#x1f47e;以下代码均经过本人实测&#xff0c;请放心食用。顺便求个关注&#xff0c;谢谢&#xff01;&#xff01; 文章目录 Java网络 - 应用篇Socket 篇简介代码实现SockerServerSocketClient RestTemplate 篇简介...ForEntity 与 ...ForObject 对比示…

IPFoxy代理IP:IPv4与IPv6性能与安全性对比

在使用IPFoxy静态代理IP的过程中&#xff0c;经常有小白朋友疑惑&#xff0c;IPv4与IPv6有何区别&#xff1f;他们在性能与安全上的差别如何&#xff0c;又该如何选择&#xff1f;在这篇博文中&#xff0c;我们将从各个方面为您科普这一区别&#xff0c;帮助您更好的选择。 一、…

柒拾肆- 如何通过数据影响决策(五)- 时序数据

什么是好&#xff1f; 对于 单一时序指标 来说&#xff08;如最简单的 销售、日活顾客数、订单数 等 &#xff09;&#xff0c;在决策时该怎样 看 呢&#xff1f; 或者换句话说&#xff0c;数据 应该怎样 表达 才能让决策者做出 更全面 的决策呢&#xff1f; 一、目前的方式 …

Mkdocs中文系列教程补充(1)

什么是requirements.txt 我的理解是mkdocs依赖的py库 第一次建立MKdocs文档使用 mkdocs new . 完后&#xff0c;比较建议执行一下&#xff1a; pip install -r requirements.txt 不然mkdocs serve后会出现什么 xxx not found &#xff0c;比如下面这位老哥 示例 mkdocs …

【C++】循环、控制流语句、

8、循环&#xff08;loops&#xff09;&#xff08;1&#xff09;for loops for循环非常灵活&#xff0c;可以做很多事情。上图红框框出来的代码块就是一个for循环。 for是关键字 for后面内容分为三部分&#xff0c;每部分用分号&#xff1b;隔开 第一部分A是变量的声明&…

Qt入门小项目 | 实现一个图片查看器

文章目录 一、实现一个图片查看软件 一、实现一个图片查看软件 需要实现的功能&#xff1a; 打开目录选择图片显示图片的名字显示图片 在以上功能的基础上进行优化&#xff0c;需要解决如下问题&#xff1a; 如何记住上次打开的路径&#xff1f; 将路径保存到配置文件中&#x…

使用MAT定位线上OOM问题

目录 1.什么是OOM? 2.发生的可能原因 3.常见类型的OOM 4.如何定位问题&#xff1f; 4.1 获取dump文件 4.2 MAT分析 「Leak Suspects」泄露嫌疑 「Histogram」直方图 「dominator tree」支配树 「thread overview」线程视图 目录 1.什么是OOM? 2.发生的可能原因 …

深度学习入门5——为什么神经网络可以学习?

在理解神经网络的可学习性之前&#xff0c;需要先从数学中的导数、数值微分、偏导数、梯度等概念入手&#xff0c;从而理解为什么神经网络具备学习能力。 1.数值微分的定义 先从导数出发理解什么是梯度。某一点的导数直观理解就是在该点的切线的斜率。在数学中导数表示某个瞬…

05-对混合app应用中的元素进行定位

本文介绍对于混合app应用中的元素如何进行定位。 一、app的类型 1&#xff09;Native App&#xff08;原生应用&#xff09; 原生应用是指利用Android、IOS平台官方的开发语言、开发类库、工具等进行开发的app应用&#xff0c;在应用性能和交互体验上应该是最好的。 通俗点来…

Win10录屏,3种方法,快速搞定

在数字化时代&#xff0c;录屏功能已经成为了我们日常生活和工作中不可或缺的一部分。无论是为了制作教学视频&#xff0c;还是为了记录游戏的高光时刻&#xff0c;还是为了保存开会内容&#xff0c;录屏功能都能为我们提供极大的便利。Win10操作系统作为微软推出的经典之作&am…

在k8s中部署Elasticsearch高可用集群详细教程

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、为什么在k8s中部署elasti…

Redis 6.0新特性详解

Redis 6.0新特性主要有3个&#xff1a;多线程、Client Side Cache、Acls。下面详细说明一下。 1.多线程 redis 6.0 提供了多线程的支持&#xff0c;redis 6 以前的版本&#xff0c;严格来说也是多线程&#xff0c;只不过执行用户命令的请求时单线程模型&#xff0c;还有一些线…

鸿蒙HarmonyOS实战:状态管理和传值

状态管理 State State是一个装饰器&#xff0c;是用来存放数据的&#xff0c;比较好理解 由State的数据来进行状态驱动视图更新 代码很简单 State count: number 0; 需要注意的是State初始化的数据必须赋值 这里我们讨论简单用法&#xff0c;至于复杂的用法可以到项目中介绍…

RAG 流程及论文串烧

文档切片 文档切片的五个层次 https://medium.com/anuragmishra_27746/five-levels-of-chunking-strategies-in-rag-notes-from-gregs-video-7b735895694d#b123 Basic RAG 与 Advanced RAG https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d…

Python学习笔记14:进阶篇(三)。类的终结篇,类的导入和模块的导入。

前言 这篇文章属于类知识的最后一篇&#xff0c;带一点点其他知识&#xff0c;学习内容来自于Python crash course。 关注我私信发送Python crash course&#xff0c;分享一份中文版PDF。 类的导入 在学习的时候&#xff0c;包括之前&#xff0c;我都是在一个文件中把所有代…