因為項目的需求,需要在路由切換的時候,加入一些比較 zb 的視覺效果,所以研究了一下。把這些學習的過程記錄下來,以便以後回顧。同時也希望這些內容能夠幫助一些跟我一樣的菜鳥,讓他們少走些坑。可能我對代碼的表述不是很到位,希望大家不要介意。機智的你們一定可以看明白。 1.插件依賴 使用的插件是react ...
因為項目的需求,需要在路由切換的時候,加入一些比較 zb 的視覺效果,所以研究了一下。把這些學習的過程記錄下來,以便以後回顧。同時也希望這些內容能夠幫助一些跟我一樣的菜鳥,讓他們少走些坑。可能我對代碼的表述不是很到位,希望大家不要介意。機智的你們一定可以看明白。
1.插件依賴
使用的插件是react-transition-group
。先簡單介紹一下動畫插件的使用方式。CSSTransition
這個組件有兩個比較主要的屬性:key
和in
。in:Boolean
屬性其實可以理解為是否顯示當前內容節點。true
則顯示,false
則不顯示。key:String
這個屬性是配合TransitionGroup
組件來使用的。在一般的列表組件中(列如 todolist),可以通過key來判斷列表中的子節點需要被插入還是移除,然後觸發動畫。
2. Switch 組件
這個組件有一個很重要的屬性:location
。同時這個屬性也是路由切換動畫的關鍵所在。Switch
組件的子組件(一般是 Route
和 Redirect
)會根據當前瀏覽器的location
作為匹配依據來進行路由匹配。但是如果Switch
組件定義了location
屬性,其中的子組件就會以定義的location
作為匹配依據。
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> )//歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:864305860 }//面向1-3年前端人員 }//幫助突破技術瓶頸,提升思維能力 export default Routes
4.原理分析
先確定需求:當切換路由的時候,舊的路由內容在一定時間內過渡消失,新的路由內容過渡顯示。
在這個需要裡面有兩個重要的部分:
- 過渡期間,會同時存在兩個節點:新節點和舊節點
- 舊節點應該顯示舊的路由內容,新的節點應該顯示新的路由內容
4.1 同時存在兩節點
剛剛提到的CSSTransition
的key
屬性可以決定該節點是否需要顯示。
而Router
中的location
屬性會在路由發生變化的時候,進行更新,而location
裡面的key
則可以作為CSSTransition的key。
關於 history
對象,可以理解為一個數組,當頁面的 location
發生變化時,或者刷新頁面,history
就會push
一個新的歷史信息。在這個歷史信息裡面,有一個key
屬性,用來區分不同的歷史記錄(跳轉新頁面或者是刷新頁面)
當路由切換的時候,location對象就會改變,新的key會使得頁面重新渲染時出現兩個CSSTransition
(新舊節點)。
4.2 新舊節點對應新舊路由內容
如果只是配置key
屬性,會發現舊的節點會去匹配新的路由內容。這是因為Route
組件預設根據當前location進行匹配。為了讓舊節點中的Route
根據舊的location
進行匹配,就需要設置Switch
的location
屬性。
結語
感謝您的觀看,如有不足之處,歡迎批評指正。