官术网_书友最值得收藏!

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不具備的。

主站蜘蛛池模板: 南溪县| 广丰县| 博湖县| 丰台区| 宣恩县| 读书| 高雄县| 蓝田县| 石城县| 隆化县| 富川| 涟源市| 平乡县| 武隆县| 泽库县| 濉溪县| 开阳县| 瓦房店市| 房产| 邓州市| 澜沧| 黄山市| 襄城县| 太谷县| 云南省| 荣昌县| 留坝县| 垣曲县| 广西| 石渠县| 台东市| 措美县| 方山县| 多伦县| 麻阳| 沙坪坝区| 大同县| 永康市| 普兰店市| 台中市| 三穗县|