react-router 路由切換動畫的實(shí)現(xiàn)示例
路由切換動畫
因?yàn)轫?xiàng)目的需求,需要在路由切換的時候,加入一些比較 zb 的視覺效果,所以研究了一下。把這些學(xué)習(xí)的過程記錄下來,以便以后回顧。同時也希望這些內(nèi)容能夠幫助一些跟我一樣的菜鳥,讓他們少走些坑。可能我對代碼的表述不是很到位,希望大家不要介意。機(jī)智的你們一定可以看明白。
參考內(nèi)容:
1.插件依賴
使用的插件是react-transition-group。先簡單介紹一下動畫插件的使用方式。
CSSTransition這個組件有兩個比較主要的屬性:key和in。
in:Boolean屬性其實(shí)可以理解為是否顯示當(dāng)前內(nèi)容節(jié)點(diǎn)。true則顯示,false則不顯示。
key:String這個屬性是配合TransitionGroup組件來使用的。在一般的列表組件中(列如 todolist),可以通過key來判斷列表中的子節(jié)點(diǎn)需要被插入還是移除,然后觸發(fā)動畫。
2. Switch 組件
這個組件有一個很重要的屬性:location。同時這個屬性也是路由切換動畫的關(guān)鍵所在。Switch組件的子組件(一般是 Route 和 Redirect)會根據(jù)當(dāng)前瀏覽器的location作為匹配依據(jù)來進(jìn)行路由匹配。但是如果Switch組件定義了location屬性,其中的子組件就會以定義的location作為匹配依據(jù)。
3.代碼部分
import React, { Component } from 'react'
import { TransitionGroup, CSSTransition } from 'react-transition-group'
import { Switch, Route, withRouter } from 'react-router-dom'
@withRouter
class Routes extends Component {
render() {
const location = this.props.location
return (
<TransitionGroup>
<CSSTransition key={location.key} timeout={1000} classNames="fade">
<Switch location={location}>
<Route path="/route-1" component={Route1} />
<Route path="/route-2" component={Route2} />
</Switch>
</CSSTransition>
</TransitionGroup>
)
}
}
export default Routes
4.原理分析
先確定需求:當(dāng)切換路由的時候,舊的路由內(nèi)容在一定時間內(nèi)過渡消失,新的路由內(nèi)容過渡顯示。
在這個需要里面有兩個重要的部分:
- 過渡期間,會同時存在兩個節(jié)點(diǎn):新節(jié)點(diǎn)和舊節(jié)點(diǎn)
- 舊節(jié)點(diǎn)應(yīng)該顯示舊的路由內(nèi)容,新的節(jié)點(diǎn)應(yīng)該顯示新的路由內(nèi)容
4.1 同時存在兩節(jié)點(diǎn)
剛剛提到的CSSTransition的key屬性可以決定該節(jié)點(diǎn)是否需要顯示。
而Router中的location屬性會在路由發(fā)生變化的時候,進(jìn)行更新,而location里面的key則可以作為CSSTransition的key。
關(guān)于 history 對象,可以理解為一個數(shù)組,當(dāng)頁面的 location 發(fā)生變化時,或者刷新頁面,history 就會push一個新的歷史信息。在這個歷史信息里面,有一個key屬性,用來區(qū)分不同的歷史記錄(跳轉(zhuǎn)新頁面或者是刷新頁面)
當(dāng)路由切換的時候,location對象就會改變,新的key會使得頁面重新渲染時出現(xiàn)兩個CSSTransition(新舊節(jié)點(diǎn))。
4.2 新舊節(jié)點(diǎn)對應(yīng)新舊路由內(nèi)容
如果只是配置key屬性,會發(fā)現(xiàn)舊的節(jié)點(diǎn)會去匹配新的路由內(nèi)容。這是因?yàn)?code>Route組件默認(rèn)根據(jù)當(dāng)前location進(jìn)行匹配。為了讓舊節(jié)點(diǎn)中的Route根據(jù)舊的location進(jìn)行匹配,就需要設(shè)置Switch的location屬性。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ahooks封裝cookie?localStorage?sessionStorage方法
這篇文章主要為大家介紹了ahooks封裝cookie?localStorage?sessionStorage的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
react源碼中的生命周期和事件系統(tǒng)實(shí)例解析
這篇文章主要為大家介紹了react源碼中的生命周期和事件系統(tǒng)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
React報錯map()?is?not?a?function詳析
這篇文章主要介紹了React報錯map()?is?not?a?function詳析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
使用reactjs優(yōu)化了進(jìn)度條頁面性能提高70%
這篇文章主要介紹了使用reactjs優(yōu)化了進(jìn)度條后頁面性能提高了70%的操作技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
使用react-native-image-viewer實(shí)現(xiàn)大圖預(yù)覽
這篇文章主要介紹了使用react-native-image-viewer實(shí)現(xiàn)大圖預(yù)覽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目
這篇文章主要介紹了react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03

