偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面試官:在React中組件間過(guò)渡動(dòng)畫如何實(shí)現(xiàn)?

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

[[411396]]

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

一、是什么

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

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

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

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

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

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

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

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

CSSTransition

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

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

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

當(dāng)in屬性置為false時(shí),CSSTransition會(huì)給子組件加上xxx-exit和xxx-exit-active的class,然后開(kāi)始執(zhí)行動(dòng)畫,當(dāng)動(dòng)畫結(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.       <div className={'container'}> 
  11.         <div className={'square-wrapper'}> 
  12.           <CSSTransition 
  13.             in={show} 
  14.             timeout={500} 
  15.             classNames={'fade'
  16.             unmountOnExit={true
  17.           > 
  18.             <div className={'square'} /> 
  19.           </CSSTransition> 
  20.         </div> 
  21.         <Button onClick={this.onToggle}>toggle</Button> 
  22.       </div> 
  23.     ); 
  24.   } 

對(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)畫

比如有一個(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.       <SwitchTransition mode="out-in"
  17.         <CSSTransition classNames="btn" 
  18.                        timeout={500} 
  19.                        key={isOn ? "on" : "off"}> 
  20.           { 
  21.           <button onClick={this.btnClick.bind(this)}> 
  22.             {isOn ? "on""off"
  23.           </button> 
  24.         } 
  25.         </CSSTransition> 
  26.       </SwitchTransition> 
  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)畫的時(shí)候,就可將這些CSSTransition放入到一個(gè)TransitionGroup中來(lái)完成動(dòng)畫

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

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

其處理方式如下:

  • 插入的節(jié)點(diǎn),先渲染dom,然后再做動(dòng)畫
  • 刪除的節(jié)點(diǎn),先做動(dòng)畫,然后再刪除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.       <div> 
  16.         <TransitionGroup> 
  17.           { 
  18.             this.state.friends.map((item, index) => { 
  19.               return ( 
  20.                 <CSSTransition classNames="friend" timeout={300} key={index}> 
  21.                   <div>{item}</div> 
  22.                 </CSSTransition> 
  23.               ) 
  24.             }) 
  25.           } 
  26.         </TransitionGroup> 
  27.         <button onClick={e => this.addFriend()}>+friend</button> 
  28.       </div> 
  29.     ) 
  30.   } 
  31.  
  32.   addFriend() { 
  33.     this.setState({ 
  34.       friends: [...this.state.friends, "coderwhy"
  35.     }) 
  36.   } 

對(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

 

責(zé)任編輯:武曉燕 來(lái)源: JS每日一題
相關(guān)推薦

2021-07-05 11:06:11

組件React通信

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2021-08-03 07:51:43

React項(xiàng)目面試

2024-09-11 22:51:19

線程通訊Object

2023-11-20 10:09:59

2021-06-29 09:47:34

ReactSetState機(jī)制

2021-07-06 07:27:45

React元素屬性

2022-02-09 09:37:54

ReactorNettyI/O

2024-04-09 10:40:04

2024-01-19 14:03:59

Redis緩存系統(tǒng)Spring

2024-01-26 13:16:00

RabbitMQ延遲隊(duì)列docker

2024-10-22 16:39:07

2024-10-15 10:00:06

2024-05-30 08:04:20

Netty核心組件架構(gòu)

2021-09-14 07:06:13

React項(xiàng)目TypeScript

2019-11-26 08:24:13

TCP擁塞控制網(wǎng)絡(luò)協(xié)議

2024-03-28 10:37:44

IoC依賴注入依賴查找

2015-08-13 10:29:12

面試面試官

2021-05-20 08:54:16

Go面向對(duì)象

2021-12-15 06:58:13

List 集合LinkedHashS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)