文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试官:在React中组件间过渡动画如何实现?

2024-12-03 01:30

关注

一、是什么

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

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

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

二、如何实现

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

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

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

CSSTransition

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

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

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

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

如下例子:

  1. export default class App2 extends React.PureComponent { 
  2.  
  3.   state = {show: true}; 
  4.  
  5.   onToggle = () => this.setState({show: !this.state.show}); 
  6.  
  7.   render() { 
  8.     const {show} = this.state; 
  9.     return ( 
  10.       'container'}> 
  11.         'square-wrapper'}> 
  12.           
  13.             in={show} 
  14.             timeout={500} 
  15.             classNames={'fade'
  16.             unmountOnExit={true
  17.           > 
  18.             'square'} /> 
  19.            
  20.         
 
  •         toggle 
  •       
  •  
  •     ); 
  •   } 
  • 对应css样式如下:

    1. .fade-enter { 
    2.   opacity: 0; 
    3.   transform: translateX(100%); 
    4.  
    5. .fade-enter-active { 
    6.   opacity: 1; 
    7.   transform: translateX(0); 
    8.   transition: all 500ms; 
    9.  
    10. .fade-exit { 
    11.   opacity: 1; 
    12.   transform: translateX(0); 
    13.  
    14. .fade-exit-active { 
    15.   opacity: 0; 
    16.   transform: translateX(-100%); 
    17.   transition: all 500ms; 

    SwitchTransition

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

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

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

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

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

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

    1. import { SwitchTransition, CSSTransition } from "react-transition-group"
    2.  
    3. export default class SwitchAnimation extends PureComponent { 
    4.   constructor(props) { 
    5.     super(props); 
    6.  
    7.     this.state = { 
    8.       isOn: true 
    9.     } 
    10.   } 
    11.  
    12.   render() { 
    13.     const {isOn} = this.state; 
    14.  
    15.     return ( 
    16.       "out-in"
    17.         "btn" 
    18.                        timeout={500} 
    19.                        key={isOn ? "on" : "off"}> 
    20.           { 
    21.            
    22.             {isOn ? "on""off"
    23.            
    24.         } 
    25.          
    26.        
    27.     ) 
    28.   } 
    29.  
    30.   btnClick() { 
    31.     this.setState({isOn: !this.state.isOn}) 
    32.   } 

    css文件对应如下:

    1. .btn-enter { 
    2.   transform: translate(100%, 0); 
    3.   opacity: 0; 
    4.  
    5. .btn-enter-active { 
    6.   transform: translate(0, 0); 
    7.   opacity: 1; 
    8.   transition: all 500ms; 
    9.  
    10. .btn-exit { 
    11.   transform: translate(0, 0); 
    12.   opacity: 1; 
    13.  
    14. .btn-exit-active { 
    15.   transform: translate(-100%, 0); 
    16.   opacity: 0; 
    17.   transition: all 500ms; 

    TransitionGroup

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

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

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

    其处理方式如下:

    如下:

    1. import React, { PureComponent } from 'react' 
    2. import { CSSTransition, TransitionGroup } from 'react-transition-group'
    3.  
    4. export default class GroupAnimation extends PureComponent { 
    5.   constructor(props) { 
    6.     super(props); 
    7.  
    8.     this.state = { 
    9.       friends: [] 
    10.     } 
    11.   } 
    12.  
    13.   render() { 
    14.     return ( 
    15.       
       
    16.          
    17.           { 
    18.             this.state.friends.map((item, index) => { 
    19.               return ( 
    20.                 "friend" timeout={300} key={index}> 
    21.                   
      {item}
       
    22.                  
    23.               ) 
    24.             }) 
    25.           } 
    26.          
    27.          this.addFriend()}>+friend 
    28.       
     
  •     ) 
  •   } 
  •  
  •   addFriend() { 
  •     this.setState({ 
  •       friends: [...this.state.friends, "coderwhy"
  •     }) 
  •   } 
  • 对应css如下:

    1. .friend-enter { 
    2.     transform: translate(100%, 0); 
    3.     opacity: 0; 
    4.  
    5. .friend-enter-active { 
    6.     transform: translate(0, 0); 
    7.     opacity: 1; 
    8.     transition: all 500ms; 
    9.  
    10. .friend-exit { 
    11.     transform: translate(0, 0); 
    12.     opacity: 1; 
    13.  
    14. .friend-exit-active { 
    15.     transform: translate(-100%, 0); 
    16.     opacity: 0; 
    17.     transition: all 500ms; 

    参考文献

     

    来源:JS每日一题内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯