React之组件间过渡动画如何实现

一、是什么

在日常开发中,页面切换时的转场动画是比较基础的一个场景

当一个组件在显示与消失过程中存在过渡动画,可以很好的增加用户的体验

react中实现过渡动画效果会有很多种选择,如react-transition-groupreact-motionAnimated,以及原生的CSS都能完成切换动画

二、如何实现

react中,react-transition-group是一种很好的解决方案,其为元素添加enterenter-activeexitexit-active这一系列勾子

可以帮助我们方便的实现组件的入场和离场动画

其主要提供了三个主要的组件:

  • CSSTransition:在前端开发中,结合 CSS 来完成过渡动画效果
  • SwitchTransition:两个组件显示和隐藏切换时,使用该组件
  • TransitionGroup:将多个动画组件包裹在其中,一般用于列表中元素的动画

 CSSTransition

其实现动画的原理在于,当CSSTransitionin属性置为true时,CSSTransition首先会给其子组件加上xxx-enterxxx-enter-activeclass执行动画

当动画执行结束后,会移除两个class,并且添加-enter-doneclass

所以可以利用这一点,通过csstransition属性,让元素在两个状态之间平滑过渡,从而得到相应的动画效果

in属性置为false时,CSSTransition会给子组件加上xxx-exitxxx-exit-activeclass,然后开始执行动画,当动画结束后,移除两个class,然后添加-enter-doneclass

如下例子:

export default class App2 extends React.PureComponent {state = {show: true};onToggle = () => this.setState({show: !this.state.show});render() {const {show} = this.state;return (<div className={'container'}><div className={'square-wrapper'}><CSSTransitionin={show}timeout={500}classNames={'fade'}unmountOnExit={true}><div className={'square'} /></CSSTransition></div><Button onClick={this.onToggle}>toggle</Button></div>);}
}

对应css样式如下:

.fade-enter {opacity: 0;transform: translateX(100%);
}.fade-enter-active {opacity: 1;transform: translateX(0);transition: all 500ms;
}.fade-exit {opacity: 1;transform: translateX(0);
}.fade-exit-active {opacity: 0;transform: translateX(-100%);transition: all 500ms;
}

SwitchTransition

SwitchTransition可以完成两个组件之间切换的炫酷动画

比如有一个按钮需要在onoff之间切换,我们希望看到on先从左侧退出,off再从右侧进入

SwitchTransition中主要有一个属性mode,对应两个值:

  • in-out:表示新组件先进入,旧组件再移除;
  • out-in:表示就组件先移除,新组建再进入

SwitchTransition组件里面要有CSSTransition,不能直接包裹你想要切换的组件

里面的CSSTransition组件不再像以前那样接受in属性来判断元素是何种状态,取而代之的是key属性

下面给出一个按钮入场和出场的示例,如下:

import { SwitchTransition, CSSTransition } from "react-transition-group";export default class SwitchAnimation extends PureComponent {constructor(props) {super(props);this.state = {isOn: true}}render() {const {isOn} = this.state;return (<SwitchTransition mode="out-in"><CSSTransition classNames="btn"timeout={500}key={isOn ? "on" : "off"}>{<button onClick={this.btnClick.bind(this)}>{isOn ? "on": "off"}</button>}</CSSTransition></SwitchTransition>)}btnClick() {this.setState({isOn: !this.state.isOn})}
}

css文件对应如下:

.btn-enter {transform: translate(100%, 0);opacity: 0;
}.btn-enter-active {transform: translate(0, 0);opacity: 1;transition: all 500ms;
}.btn-exit {transform: translate(0, 0);opacity: 1;
}.btn-exit-active {transform: translate(-100%, 0);opacity: 0;transition: all 500ms;
}

TransitionGroup

当有一组动画的时候,就可将这些CSSTransition放入到一个TransitionGroup中来完成动画

同样CSSTransition里面没有in属性,用到了key属性

TransitionGroup在感知children发生变化的时候,先保存移除的节点,当动画结束后才真正移除

其处理方式如下:

  • 插入的节点,先渲染dom,然后再做动画

  • 删除的节点,先做动画,然后再删除dom

如下:

import React, { PureComponent } from 'react'
import { CSSTransition, TransitionGroup } from 'react-transition-group';export default class GroupAnimation extends PureComponent {constructor(props) {super(props);this.state = {friends: []}}render() {return (<div><TransitionGroup>{this.state.friends.map((item, index) => {return (<CSSTransition classNames="friend" timeout={300} key={index}><div>{item}</div></CSSTransition>)})}</TransitionGroup><button onClick={e => this.addFriend()}>+friend</button></div>)}addFriend() {this.setState({friends: [...this.state.friends, "coderwhy"]})}
}

对应css如下:

.friend-enter {transform: translate(100%, 0);opacity: 0;
}.friend-enter-active {transform: translate(0, 0);opacity: 1;transition: all 500ms;
}.friend-exit {transform: translate(0, 0);opacity: 1;
}.friend-exit-active {transform: translate(-100%, 0);opacity: 0;transition: all 500ms;
}

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

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

相关文章

cmd使用ssh连接Linux脚本

前言 在开发过程中&#xff0c;由于MobaXterm&#xff0c;我不知道怎么分页&#xff08;不是屏内分页&#xff09;&#xff0c;用crtlTab&#xff0c;用起来不习惯&#xff0c;主要是MobaXterm连接了多个服务器&#xff0c;切换起来很麻烦。我是比较习惯使用altTab&#xff0c…

【SA8295P 源码分析 (四)】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread_handler 数据发送线程 源码分析

【SA8295P 源码分析】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread_handler 数据发送线程 源码分析 系列文章汇总见:《【SA8295P 源码分析 (四)】网络模块 文章链接汇总 - 持续更新中》 本文链接:《【SA8295P 源码分析 (四)】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread…

js笔试面试题5道附答案

/*** 题目1&#xff1a; 解析Cookie字符串转化为对象* 输入&#xff1a;foobar; equationE%3Dmc%5E2* 输出&#xff1a;{ foo: bar, equation: Emc^2 }* 测试: parseCookie(foobar; equationE%3Dmc%5E2)*/ function parseCookie(str) {} /*** 题目2&#xff1a; 找出对象中符合…

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

jpa 连接sqlserver 发布tomcat报错 SunJSSE

报错信息&#xff1a; java.ext.dirs: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre/lib/ext:/usr/java/packages/lib/ext 20-Oct-2023 16:37:28.074 信息 [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] com.microsoft.sqlserver…

SpringBoot + MyBatis 在 jar 中可以启动但是 Idea中无法启动的原因

现象 在idea中启动始终卡住&#xff0c;查看线程堆栈发现一直在mybatis的处理过程中&#xff0c;细究了一下堆栈发现mybatis有使用远程方式加载类的情况&#xff0c;并且此时cpu会飙升&#xff0c; 在命令行中使用java -jar 的形式可以正常启动&#xff0c;但是在idea中启动始…

Java架构师分布式搜索架构

目录 1 导学1.1 初识Elasticsearch1.1.1 Elasticsearch的作用1.1.2 ELK技术栈1.1.3 Elasticsearch和lucene1.1.4.为什么不是其他搜索技术?1.1.5.总结2 Elasticsearch快速建立知识体系3 Elasticsearch和MySQL实体建立联系3.1.mapping映射属性3.2 数据分组聚合3.2.1.聚合的种类3…

图书教材经营小程序商城的作用是什么

线下图书教材店非常多&#xff0c;在以前线下店是学生、学者们经常去的场所&#xff0c;每到周末人流不绝&#xff0c;但随着互联网发展以及客户消费升级&#xff0c;如今线下书店人流量非常少&#xff0c;除了头部品牌可以支撑外&#xff0c;中小品牌几乎很难生存。 同时加之…

ssm351校园服务平台管理系统+jsp

项目名称&#xff1a;ssm351校园服务平台管理系统jsp 点击这里进入源码目录 声明&#xff1a; 适用范围&#xff1a; 本文档适用于广泛的学术和教育用途&#xff0c;包括但不限于个人学习、毕业设计和课程设计。免责声明&#xff1a; 特此声明&#xff0c;本文仅供参考学习之用…

最近的工作和生活

大家好&#xff0c;我是记得诚。 聊一聊最近的工作和生活。 不知不觉在管理岗位&#xff0c;快干一年了。技术管理还是比较纯粹&#xff0c;主要还是以解决问题为主&#xff0c;对自己的考验也更大了&#xff0c;要关注更广的技术&#xff0c;也要专注更深的技术细节。 技术…

【SA8295P 源码分析 (四)】51 - QNX NFS Server + Android NFS Client 完整配置

【SA8295P 源码分析】51 - QNX NFS Server + Android NFS Client 完整配置 一、QNX 侧 NFS Server 修改:ip 为 192.168.118.21.1 配置拷贝 nfsd、rpcbind 到 /mnt 目录下1.2 配置 exports1.3 为NFS 共享目录挂载镜像1.4 修 startup.sh 开机自启动 nfsd Server1.5 关闭 QNX 防火…

Kibana开发工具安装

版本说明 名称版本备注kibana kibana-7.7.1-linux-x86_64.tar.gz 安装配置 tar -zxvf kibana-7.7.1-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ mv kibana-7.7.1-linux-x86_64/ kibana-7.7.1/ #编辑配置文件&#xff0c;在末尾添加 vim /usr/local/kibana-7.7.1/con…

贝锐花生壳+Fooocus,快速自建可远程访问的SDXL,平替Midjourney

Midjourney、stable diffusion两款AI绘图工具是最近这段时间的热点。不过&#xff0c;事无完美&#xff0c;他们各有一些优缺点。 例如&#xff1a;stable diffusion虽然开源可私有化部署&#xff0c;但操作相对复杂&#xff0c;需要设置各类参数&#xff1b;Midjourney虽然简单…

前端成神之路-CSS(选择器、背景、特性)

前端成神之路-CSS&#xff08;选择器、背景、特性&#xff09; 目录 前端成神之路-CSS&#xff08;选择器、背景、特性&#xff09; CSS 第二天 1. CSS复合选择器 1.1 后代选择器&#xff08;重点&#xff09; 1.2 子元素选择器 1.3 交集选择器 1.4 并集选择器&#xf…

【斗罗二】天梦哥告白冰帝,唐三再返场,雨浩通过冰帝考验,觉醒新武魂

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门国漫资讯。 斗罗大陆动画第二部绝世唐门第19集已经更新了&#xff0c;全都是霍雨浩与天梦哥在极北之地&#xff0c;吸引冰帝加入造神计划的过程。不仅有天梦哥的爱情宣言告白&#xff0c;唐三也再次限时…

选择最佳的项目管理工具:推荐哪一个?

项目管理工具推荐哪个&#xff1f;Zoho Projects项目管理工具为各类团队提供卓越的项目管理解决方案。 1、全面管理各类团队项目 Zoho Projects是一款全面的项目管理工具&#xff0c;具备简化工作流程和提高团队生产力的功能。无论是软件开发与DevOps&#xff0c;还是人力资源与…

vs中C++编译未生成exe

1、新建空工程&#xff0c;添加main.h文件至“头文件”文件夹中&#xff0c;添加mian函数及实现 2、编译工程未有任何提示&#xff0c;不报错&#xff0c;不生成exe&#xff0c;无法执行 对比新建控制台程序发现.vcxproj文件中引用main.h文件为 无法生成&#xff1a; <I…

大数据精准营销告诉你如何找到对的人?

如今&#xff0c;朋友圈广告已经“稀松平常”&#xff0c;而用户接收到什么样的商品广告&#xff0c;则基本取决于平日里对微信的使用习惯。无独有偶&#xff0c;淘宝、京东等电商平台在网页中弹出的定向品类广告&#xff0c;也是大数据基于用户对于某一商品的搜索行为。 可见&…

图像识别-人脸识别与疲劳检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

磁盘格式化指南:如何正确对磁盘进行分区和初始化?

文章目录 磁盘格式化指南1. 引言1.1 简介1.2 目的 2. 磁盘格式化概述2.1 什么是磁盘格式化&#xff1f;2.2 格式化的作用和意义 3. 常用的磁盘格式化命令3.1 mkfs命令简介3.2 mkfs.ext4命令详解3.2.1 特点和优势3.2.2 使用示例 3.3 mkfs.vfat命令详解3.3.1 特点和优势3.3.2 使用…