日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
面試官:在React中組件間過(guò)渡動(dòng)畫(huà)如何實(shí)現(xiàn)?

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了沙縣免費(fèi)建站歡迎大家使用!

一、是什么

在日常開(kāi)發(fā)中,頁(yè)面切換時(shí)的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)是比較基礎(chǔ)的一個(gè)場(chǎng)景

當(dāng)一個(gè)組件在顯示與消失過(guò)程中存在過(guò)渡動(dòng)畫(huà),可以很好的增加用戶的體驗(yàn)

在react中實(shí)現(xiàn)過(guò)渡動(dòng)畫(huà)效果會(huì)有很多種選擇,如react-transition-group,react-motion,Animated,以及原生的CSS都能完成切換動(dòng)畫(huà)

二、如何實(shí)現(xiàn)

在react中,react-transition-group是一種很好的解決方案,其為元素添加enter,enter-active,exit,exit-active這一系列勾子

可以幫助我們方便的實(shí)現(xiàn)組件的入場(chǎng)和離場(chǎng)動(dòng)畫(huà)

其主要提供了三個(gè)主要的組件:

  • CSSTransition:在前端開(kāi)發(fā)中,結(jié)合 CSS 來(lái)完成過(guò)渡動(dòng)畫(huà)效果
  • SwitchTransition:兩個(gè)組件顯示和隱藏切換時(shí),使用該組件
  • TransitionGroup:將多個(gè)動(dòng)畫(huà)組件包裹在其中,一般用于列表中元素的動(dòng)畫(huà)

CSSTransition

其實(shí)現(xiàn)動(dòng)畫(huà)的原理在于,當(dāng)CSSTransition的in屬性置為true時(shí),CSSTransition首先會(huì)給其子組件加上x(chóng)xx-enter、xxx-enter-active的class執(zhí)行動(dòng)畫(huà)

當(dāng)動(dòng)畫(huà)執(zhí)行結(jié)束后,會(huì)移除兩個(gè)class,并且添加-enter-done的class

所以可以利用這一點(diǎn),通過(guò)css的transition屬性,讓元素在兩個(gè)狀態(tài)之間平滑過(guò)渡,從而得到相應(yīng)的動(dòng)畫(huà)效果

當(dāng)in屬性置為false時(shí),CSSTransition會(huì)給子組件加上x(chóng)xx-exit和xxx-exit-active的class,然后開(kāi)始執(zhí)行動(dòng)畫(huà),當(dāng)動(dòng)畫(huà)結(jié)束后,移除兩個(gè)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.        
  11.          
  12.           
  13.             in={show} 
  14.             timeout={500} 
  15.             classNames={'fade'} 
  16.             unmountOnExit={true} 
  17.           > 
  18.              
  19.            
  20.         
 
  •         toggle 
  •       
  •  
  •     ); 
  •   } 
  • 對(duì)應(yīng)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可以完成兩個(gè)組件之間切換的炫酷動(dòng)畫(huà)

    比如有一個(gè)按鈕需要在on和off之間切換,我們希望看到on先從左側(cè)退出,off再?gòu)挠覀?cè)進(jìn)入

    SwitchTransition中主要有一個(gè)屬性mode,對(duì)應(yīng)兩個(gè)值:

    • in-out:表示新組件先進(jìn)入,舊組件再移除;
    • out-in:表示就組件先移除,新組建再進(jìn)入

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

    里面的CSSTransition組件不再像以前那樣接受in屬性來(lái)判斷元素是何種狀態(tài),取而代之的是key屬性

    下面給出一個(gè)按鈕入場(chǎng)和出場(chǎng)的示例,如下:

      
     
     
     
    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.        
    17.         
    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文件對(duì)應(yīng)如下:

      
     
     
     
    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

    當(dāng)有一組動(dòng)畫(huà)的時(shí)候,就可將這些CSSTransition放入到一個(gè)TransitionGroup中來(lái)完成動(dòng)畫(huà)

    同樣CSSTransition里面沒(méi)有in屬性,用到了key屬性

    TransitionGroup在感知children發(fā)生變化的時(shí)候,先保存移除的節(jié)點(diǎn),當(dāng)動(dòng)畫(huà)結(jié)束后才真正移除

    其處理方式如下:

    • 插入的節(jié)點(diǎn),先渲染dom,然后再做動(dòng)畫(huà)
    • 刪除的節(jié)點(diǎn),先做動(dòng)畫(huà),然后再刪除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.                  
    21.                   
      {item}
       
    22.                  
    23.               ) 
    24.             }) 
    25.           } 
    26.          
    27.          this.addFriend()}>+friend 
    28.       
     
  •     ) 
  •   } 
  •  
  •   addFriend() { 
  •     this.setState({ 
  •       friends: [...this.state.friends, "coderwhy"] 
  •     }) 
  •   } 
  • 對(duì)應(yīng)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; 

    參考文獻(xiàn)

    • https://segmentfault.com/a/1190000018861018
    • https://mp.weixin.qq.com/s/14HneI7SpfrRHKtqgosIiA

    當(dāng)前標(biāo)題:面試官:在React中組件間過(guò)渡動(dòng)畫(huà)如何實(shí)現(xiàn)?
    地址分享:http://m.5511xx.com/article/dhcoeso.html