- 深入理解React Router:從原理到實(shí)踐
- 李楊韜
- 625字
- 2021-04-16 16:10:45
2.5.2 history模擬歷史棧
無論browserHistory、hashHistory還是memoryHistory,對于push與replace方法,其在內(nèi)部實(shí)現(xiàn)上都模擬了瀏覽器的歷史棧管理能力。
1.browserHistory
在代碼內(nèi)部,browserHistory維護(hù)了key的數(shù)組allKeys,用此數(shù)組記錄歷史棧的情況,其length長度與browserHistory.length的長度一致,且將key作為window.history.state的一個屬性持久化存儲在瀏覽器中。key在每次調(diào)用push方法時(shí),都會生成一個隨機(jī)值,用于唯一標(biāo)識當(dāng)前產(chǎn)生的路徑,可在創(chuàng)建history時(shí)配置keyLength屬性以控制其長度。push方法模擬了瀏覽器的歷史棧管理能力:

allKeys作為一個內(nèi)部維護(hù)的數(shù)組,其記錄了歷史棧中棧記錄的身份標(biāo)識。其中key的生成如下:

與replaceState行為一致,在調(diào)用replace時(shí)也會替換對應(yīng)棧記錄位置的key:

keyLength使用頻率較低,預(yù)計(jì)將在history v5.x之后的版本中移除。
如圖2-3所示,browserHistory雖然不能直接得知瀏覽器的歷史棧,但可以從內(nèi)存維護(hù)的allKeys數(shù)組中獲得所有key的情況。

圖2-3 瀏覽器歷史棧與browserHistory中的allKeys
如從window.hisotry.state.key中獲取到的值為gewr32,則可從allKeys數(shù)組中判斷出當(dāng)前的棧指針位于棧底。由于在內(nèi)存中維護(hù)了棧記錄,在導(dǎo)航時(shí)能獲得更加全面的信息;也可以阻止導(dǎo)航,這將在2.5.5節(jié)介紹。
2.hashHistory
hashHistory沒有持久化能力,其使用當(dāng)前路徑URL作為路徑的唯一標(biāo)識,而不是隨機(jī)生成的key,其維護(hù)的歷史棧數(shù)組為path數(shù)組allPaths。allPaths的功能等同于allKeys:

hashHistory維護(hù)的歷史棧數(shù)組allPaths同樣會在調(diào)用history.block時(shí)發(fā)揮作用。
3.memoryHistory
與browserHistory、hashHistory不同的是,memoryHistory沒有外界的副作用。由于memoryHistory模仿了瀏覽器的管理能力,其內(nèi)部自身應(yīng)維護(hù)一個歷史棧以便history.go(-1)等方法能正常運(yùn)行。與browserHistory、hashHistory不同,memoryHistory維護(hù)歷史棧的目的是提供類似瀏覽器對歷史棧的管理,而不是作為history.block的參考?xì)v史棧。而且,memoryHistory可通過history.entries接口獲取整個歷史棧信息,這是browserHistory與hashHistory不具備的。
- SQL Server 從入門到項(xiàng)目實(shí)踐(超值版)
- Oracle從入門到精通(第3版)
- Building a Game with Unity and Blender
- 高級C/C++編譯技術(shù)(典藏版)
- 人人都懂設(shè)計(jì)模式:從生活中領(lǐng)悟設(shè)計(jì)模式(Python實(shí)現(xiàn))
- Elasticsearch for Hadoop
- Serverless computing in Azure with .NET
- 蘋果的產(chǎn)品設(shè)計(jì)之道:創(chuàng)建優(yōu)秀產(chǎn)品、服務(wù)和用戶體驗(yàn)的七個原則
- Python全棧數(shù)據(jù)工程師養(yǎng)成攻略(視頻講解版)
- SQL 經(jīng)典實(shí)例
- 深入淺出Go語言編程
- R語言數(shù)據(jù)可視化:科技圖表繪制
- Zabbix Performance Tuning
- 區(qū)塊鏈項(xiàng)目開發(fā)指南
- Java 9 Programming By Example