我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

一、是什么

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

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

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

二、如何实现

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

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

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

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

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,对应两个值:

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

    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发生变化的时候,先保存移除的节点,当动画结束后才真正移除

    其处理方式如下:

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

    如下:

    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; 

    参考文献

     

    免责声明:

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

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

    React动画页面
    来源:JS每日一题内容投诉

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

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

    下载Word文档

    相关文章

    猜你喜欢

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

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

    热门标签

    Linux(148)PHP(127)Java(102)正则表达式(101)JavaScript(69)最佳实践(67)jQuery(44)MySQL(39)Docker(37)C语言(36)性能优化(34)Python(34)XML(28)string(27)第三方库(23)回调函数(23)ZIP(22)数组(22)可扩展性(22)字符串比较(21)find(20)RPM(20)Go(20)grep(19)ASP.NETCore(19)XML解析器(19)事件(19)事件处理程序(19)StringBuilder(18)Nginx(18)

    编程热搜

    编程资源站

    目录