广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react组件中过渡动画的问题解决
  • 171
分享到

react组件中过渡动画的问题解决

2024-04-02 19:04:59 171人浏览 安东尼
摘要

目录一、是什么二、如何实现CSSTransitionSwitchTransitionTransitionGroup一、是什么 在日常开发中,页面切换时的转场动画是比较基础的一个场景

一、是什么

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

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

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'}>
          <CSSTransition
            in={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;
}

以上就是react组件中过渡动画的问题解决的详细内容,更多关于react组件过渡动画 的资料请关注编程网其它相关文章!

--结束END--

本文标题: react组件中过渡动画的问题解决

本文链接: https://www.lsjlt.com/news/167091.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react组件中过渡动画的问题解决
    目录一、是什么二、如何实现CSSTransitionSwitchTransitionTransitionGroup一、是什么 在日常开发中,页面切换时的转场动画是比较基础的一个场景 ...
    99+
    2022-11-13
  • React过渡动画组件基础使用介绍
    目录1. 基础使用2. 将animate.css集成到csstranistion中3. 列表过渡4. switchTransition动画5. 路由切换过渡6. 高阶组件实现路由切换...
    99+
    2022-11-13
  • Vue怎么解决路由过渡动画抖动问题
    这篇“Vue怎么解决路由过渡动画抖动问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vu...
    99+
    2022-10-19
  • React中过渡动画的编写方式实例详解
    目录React的过渡动画过渡动画库的介绍CSSTransition(掌握)SwitchTransition(了解)TransitionGroup(了解) 总结React的过...
    99+
    2022-11-13
  • 如何解决React中组件通信问题
    这篇文章将为大家详细讲解有关如何解决React中组件通信问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。父子组件父 → 子parent组件传给child组件,符合rea...
    99+
    2022-10-19
  • 解决react组件渲染两次的问题
    目录react组件渲染两次react总结之避免不必要的重复渲染类组件PureComponent使用插件seamless-immutable使用插件pure-render-decora...
    99+
    2022-11-13
    react组件渲染 react渲染两次 react组件
  • React中的权限组件设计问题怎么解决
    这篇“React中的权限组件设计问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React中的权限组件设计问题怎么...
    99+
    2023-07-02
  • Android中Activity过渡动画的实例讲解
    目录前言分解动画效果视频解析滑动动画效果视频解析淡出动画效果视频解析共享元素共享单个元素解析共享多个元素效果视频全部代码总结前言 以前Activty之间得跳转非常生硬,自Androi...
    99+
    2022-11-12
  • vue实现过渡动画Message消息提示组件示例详解
    目录概述目录结构总结概述 在我自己平时做项目的时候,必不可少的会用到message组件,用来对用户友好反馈,总之使用频率还是挺高的,刚开始工作的时候,经常用的就是组件库的现成的,想想...
    99+
    2022-11-13
  • 解决React中的re-render问题
    目录re-render?错误的优化Object.is合理使用useEffect,解决re-render简单实现useEffect文章转自公众号:前端巅峰 re-render? 首先使...
    99+
    2022-11-12
  • 详解jQuery的animate动画方法及动画排队问题解决
    目录animate()动画方法 动画排队 delay()延迟方法 stop()停止动画方法 清空动画排队 动画排队问题 animate()动画方法 作用:执行css属性集...
    99+
    2022-11-12
  • 如何解决jQuery中animate动画方法及动画排队的问题
    这篇文章将为大家详细讲解有关如何解决jQuery中animate动画方法及动画排队的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库...
    99+
    2023-06-14
  • react中hooks解决的问题有哪些
    这篇文章主要介绍“react中hooks解决的问题有哪些”,在日常操作中,相信很多人在react中hooks解决的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”re...
    99+
    2022-10-19
  • 怎么解决React中的re-render问题
    这篇文章主要介绍“怎么解决React中的re-render问题”,在日常操作中,相信很多人在怎么解决React中的re-render问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决React中的re...
    99+
    2023-06-29
  • vue中的vendor.js文件过大问题及解决
    目录vue vendor.js文件过大问题1. cdn 引入2. 在使用vue等包的地方,注释掉import引入3. 打包忽视掉vue等包vue打包降低vendors.js文件大小v...
    99+
    2022-11-13
    vue中vendor.js vendor.js文件过大 vue vendor过大
  • 如何解决semantic-ui-react图像组件不显示图像的问题
    这篇文章主要介绍了如何解决semantic-ui-react图像组件不显示图像的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。问题Rea...
    99+
    2022-10-19
  • Tomcat解决catalina.out文件过大的问题
    目录前言暴力型技术型前言 有用Tomcat的,绝对都会遇到这样一个问题:catalina.out文件过大。 它是Tomcat默认生成的日志文件,会随着时间的推移,逐渐增大,不断的增长...
    99+
    2022-11-13
  • React中的权限组件设计问题小结
    目录背景所谓的权限控制是什么?实现思路路由权限菜单权限背景 权限管理是中后台系统中常见的需求之一。之前做过基于 Vue 的后台管理系统权限控制,基本思路就是在一些路由钩子里做权限比对...
    99+
    2022-11-13
  • 如何使用React高阶组件解决横切关注点问题
    这篇文章主要介绍“如何使用React高阶组件解决横切关注点问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用React高阶组件解决横切关注点问题”文章能帮助大家解决问题。高阶组件(HOC)概...
    99+
    2023-07-04
  • 通过数组给您的文件排序284587问题及解决
    当您使用FILESYSTEMOBJECT对象获得某个目录下的文件列表的时候,你有没有发现无法控制它们的排序方式,比如按照名字排序,按照扩展名排序,按照文件大小排序等等,让我们试着用数...
    99+
    2023-05-20
    asp 数组给您的文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作