- 深入理解React Router:從原理到實踐
- 李楊韜
- 962字
- 2021-04-16 16:10:40
2.2.2 history導航
1.history.push
history.push作為2.1節介紹過的歷史對象的通用方法,類似于1.2節中的history.pushState,其主要作用為添加一個歷史記錄。其簽名如下:

當第一個參數為字符串時,即真實導航路徑,底層會使用history.pushState方法,無刷新改變URL;第二個參數對應為history.pushState的state對象,能持久化地存儲狀態在瀏覽器中。注意,state需要為可結構化克隆的對象,在1.2節中有過介紹。

若第一個參數為路徑描述對象,則可將state、hash等值傳入其中。

傳入路徑描述對象也等價于各部分字符串的拼接。
注意,對于browserHistory的每次push調用,都將產生一個隨機的key值,該key值可從browserHistory.location中獲取,并持久化存儲于window.history.state中。這個隨機值的字符串長度由創建history時的keyLength配置進行控制,默認為6,其作用為標識本次導航,將在2.5.2節介紹。

對于push方法,在history源碼中的調用為pushState方法。

與原始的pushState方法不同的是,history.push方法的行為可在history.block被調用后改變,如:


與history.pushState不同的是,history.pushState函數不會觸發popstate事件,history.pushState函數沒有對應的回調監聽;而沒有被阻止的history.push方法會在狀態更新后,觸發history.listen監聽的回調函數。回調函數的參數為當前最新的地址對象和值為“PUSH”的導航行為標識。
對于push,其都支持相對路徑與僅帶參數的調用方式,具體解析規則與1.2.3節中介紹的解析規則一致。

注意,當創建history的forceRefresh為true時,框架將不使用pushState原生方法,而是直接調用window.location.href=href刷新頁面。
2.history.replace
與history.push一樣,history.replace也可以改變瀏覽器地址。其聲明為:

在調用history.replace時,產生的action為“REPLACE”。在使用上,history.replace的入參與history.push的入參類型均一致,既允許傳入state對象,也可傳入相對路徑,同樣可被history.block阻止。

與history.push不同的是,history.replace用于替換當前棧指針所指記錄。在history源碼內部,history.replace使用了history.replaceState:

在1.2.2節中曾介紹過history.replaceState,而history.push方法使用的是window.history.pushState,其會添加棧記錄。對于history.replace,由于history.replaceState的調用不會觸發popstate事件,所以history.replace的調用也不會觸發popstate事件。
如果初始化的history的forceRefresh為true,則history.replace將使用window.location.replace(href)進行頁面更新,強制刷新頁面。
history.replace方法的key生成與history.push方法一致,調用history.replace后在location中將有一個隨機key值,key值同樣會持久化存儲到window.history.state中。

key值將標識一次唯一的導航,可作為導航的唯一憑證。browserHistory在導航過程中產生的所有key值將被保存在內存中,用于標識棧記錄,相關內容將在2.5.2節進行介紹。
3.history.go
history.go及history.goBack、history.goForward使用了window中的window.history.go方法,其僅做了簡單的包裝:

在1.3.1節中介紹過window.history.go等方法,其僅移動瀏覽器的棧記錄指針,不對棧的內容產生影響,等同于瀏覽器的前進或后退操作。
當調用history.go等方法時,瀏覽器中監聽的popstate事件回調函數會觸發。browserHistory會監聽此事件更新location地址,相關內容將在2.5.3節進行介紹。
- JavaScript+DHTML語法與范例詳解詞典
- C#完全自學教程
- 單片機C語言程序設計實訓100例:基于STC8051+Proteus仿真與實戰
- 看透JavaScript:原理、方法與實踐
- Hands-On C++ Game Animation Programming
- Python機器學習實戰
- Magento 1.8 Development Cookbook
- Windows Server 2016 Automation with PowerShell Cookbook(Second Edition)
- 深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)
- Python 3 數據分析與機器學習實戰
- 區塊鏈架構之美:從比特幣、以太坊、超級賬本看區塊鏈架構設計
- Django Design Patterns and Best Practices
- Moodle 3 Administration(Third Edition)
- PHP項目開發全程實錄(第4版)
- 程序員必會的40種算法