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

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節進行介紹。

主站蜘蛛池模板: 毕节市| 聂拉木县| 温宿县| 丹巴县| 股票| 精河县| 延长县| 临洮县| 巧家县| 泗水县| 禹州市| 宁德市| 措美县| 德安县| 阳高县| 天气| 收藏| 安塞县| 论坛| 鹤山市| 新巴尔虎左旗| 中阳县| 合江县| 化德县| 喜德县| 仙游县| 高安市| 南阳市| 博白县| 南木林县| 马边| 阜阳市| 和平县| 通渭县| 定襄县| 睢宁县| 佛山市| 色达县| 酒泉市| 七台河市| 宣威市|