react-router實現機制
- 2019 年 12 月 4 日
- 筆記
本文作者:IMWeb 張穎 原文出處:IMWeb社區 未經同意,禁止轉載
react-router使用方式
react-router是專為React設計的路由解決方案,以react component的方式提供API,包含常用的Router,Route,IndexRedirect,Link,browserHistory等。react-router充分利用react component提供的生命周期特性,使定義路由和開發react component體驗一致。
嵌套的路由表
聲明一份路徑到各個component的映射表結構非常清晰:
<Provider store={store}> <Router history={browserHistory}> <Route path="/" component={AppSimple}> <Route path="/editor" component={Editor} /> <IndexRedirect to="/proj" /> </Route> </Router> </Provider>
而且支持多層嵌套
<Provider store={store}> <Router history={browserHistory}> <Route path="/" component={App} onEnter={auth}> <Route path="/proj" component={Proj} /> <Route path="/user" component={User} /> <Route path="/admin" component={AdminWrapper}> <Route path="/admin/proj" name="adminProj" component={Admin.Proj} /> <Route path="/admin/container" component={Admin.Container} /> <IndexRedirect to="/admin/proj" /> </Route> <Route path="/help" component={Help} /> </Route> </Router> </Provider>
Link取代a元素
Link組件可以接收Router的狀態,用於取代a元素,生成一個鏈接,允許用戶點擊後跳轉到另一個路由。同時提供activeStyle或者activeClassName來定義鏈接觸發樣式。
<Link to={`/history?act_id=${record.act_id}`} activeClassName="active">查看歷史版本</Link>
導航到路由頁面browserHistory.push
除了使用Link組件做正常的用戶點擊跳轉,在提交表單或者點擊按鈕有額外操作時,如何導航到路由頁面呢?History API很方便:
browserHistory.push(`/tpl?proj_id=${key}`)
react-router實現機制
react-router依賴基礎
react-router是基於history模塊提供的api進行上層開發的:
- historyModule中的路徑更新機制是:historyModule.updateLocation() -> listener( );
- Router對historyModule進行回調注入,所以路徑更新機制變成:historyModule.updateLocation() -> Router.listen中的回調函數;
- Router 在 react component 生命周期之組件被掛載前 componentWillMount 中使用 this.history.listen 去註冊了 url 更新的回調函數,回調中觸發react的setState方法來觸發component render。
- 回調中的match方法拿到當前的location,然後根據我們所聲明的路由表來匹配對應的路由子集,然後更新路由狀態值state,得到對應的component,從而觸發render。
Link組件更新url的執行過程
react-router做了什麼?
- 實現的回調函數,含有能夠更新react UI的setState方法。
- 註冊回調:在Router的componentWillMount中使用history.listen註冊回調函數,此回調函數存放在history模塊的回調函數數組changeListeners中。
Link點擊後發生了什麼?
- Link組件組織瀏覽器的默認跳轉行為,使用history模塊的pushState方法觸發url更新;
- 然後執行updateLocation方法,觸發history中的回調函數數組changeListeners執行;
- 從而觸發我們註冊的含有能夠更新react UI的setState方法的回調函數執行,更新頁面。