react-router 路由切換動畫

路由切換動畫

參考內容:react

1.插件依賴

使用的插件是react-transition-group。先簡單介紹一下動畫插件的使用方式。web

CSSTransition這個組件有兩個比較主要的屬性:keyinapi

in:Boolean屬性其實能夠理解爲是否顯示當前內容節點。true則顯示,false則不顯示。數組

key:String這個屬性是配合TransitionGroup組件來使用的。在通常的列表組件中(列如 todolist),能夠經過key來判斷列表中的子節點須要被插入仍是移除,而後觸發動畫。瀏覽器

2. Switch 組件

這個組件有一個很重要的屬性:location。同時這個屬性也是路由切換動畫的關鍵所在。Switch組件的子組件(通常是 Route 和 Redirect)會根據當前瀏覽器的location做爲匹配依據來進行路由匹配。可是若是Switch組件定義了location屬性,其中的子組件就會以定義的location做爲匹配依據。react-router

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.原理分析

先肯定需求:當切換路由的時候,舊的路由內容在必定時間內過渡消失,新的路由內容過渡顯示。
在這個須要裏面有兩個重要的部分:dom

  1. 過渡期間,會同時存在兩個節點:新節點和舊節點
  2. 舊節點應該顯示舊的路由內容,新的節點應該顯示新的路由內容

4.1 同時存在兩節點

剛剛提到的CSSTransitionkey屬性能夠決定該節點是否須要顯示。
Router中的location屬性會在路由發生變化的時候,進行更新,而location裏面的key則能夠做爲CSSTransitionkey動畫

關於 history 對象,能夠理解爲一個數組,當頁面的 location 發生變化時,或者刷新頁面,history 就會 push一個新的歷史信息。在這個歷史信息裏面,有一個 key屬性,用來區分不一樣的歷史記錄(跳轉新頁面或者是刷新頁面)

當路由切換的時候,location對象就會改變,新的key會使得頁面從新渲染時出現兩個CSSTransition(新舊節點)。this

4.2 新舊節點對應新舊路由內容

若是隻是配置key屬性,會發現舊的節點會去匹配新的路由內容。這是由於Route組件默認根據當前location進行匹配。爲了讓舊節點中的Route根據舊的location進行匹配,就須要設置Switchlocation屬性。插件

相關文章
相關標籤/搜索