前言
接觸react也有一段時間了,一直在做關於react前端架構相關的研究,今天遇見了一個需求:在做後臺管理專案的時候,產品經理提出:從列表頁填寫查詢條件,然後查詢出結果,點選某一條結果進入編輯頁面,編輯完了之後返回列表頁,還想看到之前查詢的條件和查詢的結果;(目前是返回直接重新整理頁面,等於查詢條件為空)。
接觸過vue的同學知道 vue有一個keep-alive可以快取元件狀態,在做移動端應用的時候非常方便,提高效能;那麼react有沒有這樣一個東西呢?當然有,那就是React-Keeper了
github地址 https://github.com/vifird/rea…
更新
專案實踐
使用React-Keeper還是要慎重,react-keeper加上會出現兩個問題:1.狀態快取了,如果很多頁面都是列表,這代表每個頁面都有快取資料,下次進入頁面的時候會展示離開時的狀態,那麼快取的資料量也不少,會佔用瀏覽器記憶體,效能肯定會有影響,什麼時候清除是個問題。外掛提供了cache=`parent`為父元件快取,在父元件不解綁的情況下會維持快取狀態。那麼要解決的話就要有個父元件,如果父元件是最外層元件,不會解除,那麼就要改變路由了,但外掛並沒有提供手動消除快取的方式,使用起來很不靈活,而且會與router3 link有些不同,總之挺麻煩的。2.樣式問題,頁面回來時,有些樣式會缺失,利用生命週期可以解決,但componentDidMount不會執行,componentWillUpdate、render和 componentDidUpdate,如果你在這些週期裡面改變資料狀態,那麼元件週期將一直迴圈下去,瀏覽器效能大受影響!
下面就是轉載的內容了
瞭解React的同學一定了解React-Router,這個幾乎是React單頁面應用必備的路由框架。如果有足夠多的開發經驗,你一定會發現React-Router的很多問題,比如:沒有頁面快取、不能傳遞屬性、脫離JSX的動態載入和過濾器實現等,這些問題尤其在移動端表現問題更多。
這裡我們來推薦一款更強大的React路由器:React-Keeper,一個比React-Router更靈活、更適用於移動端、路由功能更健壯的框架,React-Keeper除了基礎功能更強大以外,特別對移動APP的路由做了增強,能夠滿足更豐富的移動端場景。
React-Keeper吸收了React-Router的思想,使用方式與React-Router相似度很大,都提供了Route元件和Link元件,基本可以實現React-Router的平滑遷移。React-Keeper的基礎教程,可以參考其Github : Github [React-Keeper],這裡我重點介紹一下React-Keeper的特性。
特性介紹
1.可擴充套件路由
允許你在任何時間、任何元件內新增路由配置。如下面:我們可以在路由匹配的的元件Products中再新增路由元件。這種特性,對團隊合作開發很友好,可以讓路由配置也按模組化的切分;也非常適用於有動態載入需求的大型網站。(這個特性在React-Router最新版中也已經得到了支援)
const App = ()=> {
return (
<HashRouter>
<div>
<Route component={ Home } path="/"/>
<Route component={ Products } path="/products"/>
</div>
</HashRouter>
)
}
const Products = ()=> {
return (
<div>
<Route component={ ScienceProducts } path="/sci" />
<Route component={ DailiUseProducts } path="/dai" />
</div>
)
}
ReactDOM.render(<App/>, document.getElementById(`root`))
2.頁面快取
在移動開發中,我們經常會遇到這樣的場景:在一個列表頁瀏覽了很久,點選一項進入詳情頁,然後再返回到列表頁,這時候我們希望列表頁能保留在之前的狀態(滾動位置、臨時操作等),React-Router無法解決這個問題,在返回後列表頁的DOM要重新載入,所以我們不得不重新手動找回之前的狀態(滾動到之前的位置)。
這裡我們需要一個頁面快取機制來解決這個問題。所謂頁面快取,即當地址與路由不匹配時,自動快取頁面的狀態,當匹配時,再對頁面進行還原。
頁面快取是React-Keeper的一個重要特性,其內部整合了快取管理器,可以對路由元件的繫結與解綁進行代理,從而實現了頁面快取。React-Keeper提供了3種頁面快取方式,下面我們來分別進行介紹。
2.1 cache屬性
所有新增了cache屬性的路由元件,React-Keeper快取管理器都會頁面進行代理。在下面的示例中,Home、AboutUs頁面會使用快取代理:
class App extends React.Component {
render() {
return (
<HashRouter>
<div>
<Route cache component={Home} path=`/`/>
<Route component={Host} path=`/host` />
<Route cache=`parent` path=`/aboutus` component={AboutUs}/>
</div>
</HashRouter>
)
}
}
ReactDOM.render(<App/>, document.getElementById(`root`))
cache屬性可以新增屬性值,React-Keeper支援的屬性值有root(default)、parent。
cache=`root`(或cache)為永久快取,只要根元件不解綁,頁面將永久快取。
cache=`parent`為父元件快取,在父元件不解綁的情況下會維持快取狀態。
2.2 CacheLink元件
React-Keeper額外提供了CacheLink元件,繼承自Link,故有Link元件的所有特性,此外,其內部對接了快取管理器,可以對連結跳轉環節進行代理。
CacheLink快取為臨時快取,當使用其新開啟頁面時,快取管理器會臨時快取連結的來源頁面,當返回時至之前頁面(或路由狀態變更)時,提取快取頁面以展示,並清除快取。
這種特性適用於非常用列表頁的快取,使用方式如下:
<ul className=`nav navbar-nav`>
<li>
<Link to=`/`>Home</Link>
</li>
<li>
<CacheLink to=`/product/ASDFADF`>Detail</CacheLink>
</li>
</ul>
3.標籤化過濾器
在React-Keeper中,我們可以為每一個Route元件單獨定義多個過濾器,當過濾器驗證通過後才能進行下面的操作,Route支援兩類過濾器:繫結過濾器、解綁過濾器。
過濾器的使用場景,最常用的應該就是登入驗證,對於某些需要登入後才能訪問的資源,我們希望登入檢測通過後再進行頁面繫結,而不是先跳轉頁面再進行驗證。下面是React-Keeper官網登入過濾的示例程式碼:
// Define a fllter, and run over it or not.
// receive `props`
const loginFilter = (callback, props)=> {
if(!props.host) {
// dynamicly request data (use jQuery ajax)
$.ajax({
url: `host/login.do`,
data: {},
succeed: function(data){
if(data.host){
// run `callback` function to enter next step (render component or next filter)
callback()
}
},
error: function(){
},
dataType: `json`
})
}
}
// Added to Route Component
// Single Filter
<HashRouter>
<Route path=`/user` component={User}, enterFilter={ loginFilter } />
</HashRouter>
// Multiple Filters
<HashRouter>
<Route path=`/user` component={User}, enterFilter={[ loginFilter, permitFilter1, permitFilter2 ] } />
</HashRouter>
4.標籤化動態載入
React-Keeper支援動態元件載入,而動態載入使用方式也是非常簡單,可以直接在Route元件行進行操作。使用方式如下:
<Route loadComponent={ (callback)=>{
System.import(`../Products.js`).then((Products)=>{
callback(Products)
})
} } path=`/products`>
在React-Keeper的內部處理中,當path匹配的時候,才會進行檔案的載入,這對於大型的WEB應用無疑是非常必要的。
注意:過濾器的執行,在動態檔案載入之後。
5.靈活的配置
- React-Keeper的Route元件支援自定義屬性,並會將所有自定義的屬性傳遞給要渲染的元件。
-
React-Keeper的配置相當靈活,可以全部採用元件屬性化的配置,比如index、cache、miss等,以下是Route元件所有的保留詞:
index : 入口元件
miss : 地址不匹配時渲染的元件
cache : 快取標記
redirect : 重定向地址 (當元件滿足渲染條件時才會執行)
path : 匹配地址規則
component :要匹配的元件
loadComponent : 動態載入元件
enterFilter : 掛載過濾器
leaveFilter : 解除安裝過濾器
offDirtyCheck : 關閉髒檢查。React-Keep會預設啟用髒檢查,以避免地址變更時不必要的渲染
<HashRouter>
<div><Route index component={Home} path=`/`/> <Route cache component={Host} path=`/host` /> <Route miss path=`/aboutus` component={AboutUs}/> <Route path=`/other` redirect=`/redirect`/>
</div>
</HashRouter>
寫在最後
讀React-Keeper原始碼,發現內部有幾點值得React開發者借鑑的地方:
- 可擴充套件路由的實現方式採用了訂閱模式,進行Route的集中管理,通過減少監聽事件保證了路由管理的效率。
- 預設使用資料髒檢查,避免不必要的渲染。
- 快取管理是重要的一個核心功能,React-Keeper內部整合了兩個快取管理器,並在每次地址變更時對快取進行清理。
- 整合了地址匹配快取以提高匹配的效率。
- 無狀態元件(Stateless Component)的管理,使用react-funtional庫將元件轉換為有狀態元件的方式。
React-Keeper還是一個比較新的框架,國內外實踐的人還比較少。從原始碼級別看其實現,在前端世界眾多而雜亂的開源框架中,算是質量很高的一個。