国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

詳解vue 單頁應用(spa)前端路由實現原理

來源:懂視網 責編:小采 時間:2020-11-27 22:17:01
文檔

詳解vue 單頁應用(spa)前端路由實現原理

詳解vue 單頁應用(spa)前端路由實現原理:寫在前面:通常 SPA 中前端路由有2種實現方式: window.history location.hash 下面就來介紹下這兩種方式具體怎么實現的 一.history 1.history基本介紹 window.history 對象包含瀏覽器的歷史,window.history 對象在編寫時可不使用 wi
推薦度:
導讀詳解vue 單頁應用(spa)前端路由實現原理:寫在前面:通常 SPA 中前端路由有2種實現方式: window.history location.hash 下面就來介紹下這兩種方式具體怎么實現的 一.history 1.history基本介紹 window.history 對象包含瀏覽器的歷史,window.history 對象在編寫時可不使用 wi

寫在前面:通常 SPA 中前端路由有2種實現方式:

  1. window.history
  2. location.hash

下面就來介紹下這兩種方式具體怎么實現的

一.history

1.history基本介紹

window.history 對象包含瀏覽器的歷史,window.history 對象在編寫時可不使用 window 這個前綴。history是實現SPA前端路由是一種主流方法,它有幾個原始方法:

  1. history.back() - 與在瀏覽器點擊后退按鈕相同
  2. history.forward() - 與在瀏覽器中點擊按鈕向前相同
  3. history.go(n) - 接受一個整數作為參數,移動到該整數指定的頁面,比如go(1)相當于forward(),go(-1)相當于back(),go(0)相當于刷新當前頁面
  4. 如果移動的位置超出了訪問歷史的邊界,以上三個方法并不報錯,而是靜默失敗

在HTML5,history對象提出了 pushState() 方法和 replaceState() 方法,這兩個方法可以用來向歷史棧中添加數據,就好像 url 變化了一樣(過去只有 url 變化歷史棧才會變化),這樣就可以很好的模擬瀏覽歷史和前進后退了,現在的前端路由也是基于這個原理實現的。

2.history.pushState

pushState(stateObj, title, url) 方法向歷史棧中寫入數據,其第一個參數是要寫入的數據對象(不大于640kB),第二個參數是頁面的 title, 第三個參數是 url (相對路徑)。

  1. stateObj :一個與指定網址相關的狀態對象,popstate事件觸發時,該對象會傳入回調函數。如果不需要這個對象,此處可以填null。
  2. title:新頁面的標題,但是所有瀏覽器目前都忽略這個值,因此這里可以填null。
  3. url:新的網址,必須與當前頁面處在同一個域。瀏覽器的地址欄將顯示這個網址。

關于pushState,有幾個值得注意的地方:

pushState方法不會觸發頁面刷新,只是導致history對象發生變化,地址欄會有反應,只有當觸發前進后退等事件(back()和forward()等)時瀏覽器才會刷新

這里的 url 是受到同源策略限制的,防止惡意腳本模仿其他網站 url 用來欺騙用戶,所以當違背同源策略時將會報錯

3.history.replaceState

replaceState(stateObj, title, url) 和pushState的區別就在于它不是寫入而是替換修改瀏覽歷史中當前紀錄,其余和 pushState一模一樣

4.popstate事件

定義:每當同一個文檔的瀏覽歷史(即history對象)出現變化時,就會觸發popstate事件。

注意:僅僅調用pushState方法或replaceState方法 ,并不會觸發該事件,只有用戶點擊瀏覽器倒退按鈕和前進按鈕,或者使用JavaScript調用back、forward、go方法時才會觸發。另外,該事件只針對同一個文檔,如果瀏覽歷史的切換,導致加載不同的文檔,該事件也不會觸發。

用法:使用的時候,可以為popstate事件指定回調函數。這個回調函數的參數是一個event事件對象,它的state屬性指向pushState和replaceState方法為當前URL所提供的狀態對象(即這兩個方法的第一個參數)。

5.history實現spa前端路由代碼

<a class="api a">a.html</a>
<a class="api b">b.html</a>
 // 注冊路由
 document.querySelectorAll('.api').forEach(item => {
 item.addEventListener('click', e => {
 e.preventDefault();
 let link = item.textContent;
 if (!!(window.history && history.pushState)) {
 // 支持History API
 window.history.pushState({name: 'api'}, link, link);
 } else {
 // 不支持,可使用一些Polyfill庫來實現
 }
 }, false)
 });

 // 監聽路由
 window.addEventListener('popstate', e => {
 console.log({
 location: location.href,
 state: e.state
 })
 }, false)

popstate監聽函數里打印的e.state便是history.pushState()里傳入的第一個參數,在這里即為{name: 'api'}

二.Hash

1.Hash基本介紹

url 中可以帶有一個 hash http://localhost:9000/#/a.html

window 對象中有一個事件是 onhashchange,以下幾種情況都會觸發這個事件:

  1. 直接更改瀏覽器地址,在最后面增加或改變#hash;
  2. 通過改變location.href或location.hash的值;
  3. 通過觸發點擊帶錨點的鏈接;
  4. 瀏覽器前進后退可能導致hash的變化,前提是兩個網頁地址中的hash值不同。

2.Hash實現spa前端路由代碼

 // 注冊路由
 document.querySelectorAll('.api').forEach(item => {
 item.addEventListener('click', e => {
 e.preventDefault();
 let link = item.textContent;
 location.hash = link;
 }, false)
 });

 // 監聽路由
 window.addEventListener('hashchange', e => {
 console.log({
 location: location.href,
 hash: location.hash
 })
 }, false)

hash模式與history模式,這兩種模式都是通過瀏覽器接口實現的,除此之外vue-router還為非瀏覽器環境準備了一個abstract模式,其原理為用一個數組stack模擬出瀏覽器歷史記錄棧的功能。當然,以上只是一些核心邏輯,為保證系統的魯棒性源碼中還有大量的輔助邏輯,也很值得學習。

三、兩種模式比較

  • pushState設置的新URL可以是與當前URL同源的任意URL;而hash只可修改#后面的部分,故只可設置與當前同文檔的URL
  • pushState設置的新URL可以與當前URL一模一樣,這樣也會把記錄添加到棧中;而hash設置的新值必須與原來不一樣才會觸發記錄添加到棧中
  • pushState通過stateObject可以添加任意類型的數據到記錄中;而hash只可添加短字符串
  • pushState可額外設置title屬性供后續使用
  • 四、history模式的一個問題

    我們知道對于單頁應用來講,理想的使用場景是僅在進入應用時加載index.html,后續在的網絡操作通過Ajax完成,不會根據URL重新請求頁面,但是難免遇到特殊情況,比如用戶直接在地址欄中輸入并回車,瀏覽器重啟重新加載應用等。
    hash模式僅改變hash部分的內容,而hash部分是不會包含在HTTP請求中的:

    http://oursite.com/#/user/id // 如重新請求只會發送http://oursite.com/

    故在hash模式下遇到根據URL請求頁面的情況不會有問題。

    而history模式則會將URL修改得就和正常請求后端的URL一樣

    http://oursite.com/user/id

    在此情況下重新向后端發送請求,如后端沒有配置對應/user/id的路由處理,則會返回404錯誤。

    官方推薦的解決辦法是在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。同時這么做以后,服務器就不再返回 404 錯誤頁面,因為對于所有路徑都會返回 index.html 文件。為了避免這種情況,在 Vue 應用里面覆蓋所有的路由情況,然后在給出一個 404 頁面。或者,如果是用 Node.js 作后臺,可以使用服務端的路由來匹配 URL,當沒有匹配到路由的時候返回 404,從而實現 fallback。

    參考資料:

    1、瀏覽器History API :https://developer.mozilla.org/zh-CN/docs/Web/API/History_API

    2、解決History模式訪問404的方案:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    詳解vue 單頁應用(spa)前端路由實現原理

    詳解vue 單頁應用(spa)前端路由實現原理:寫在前面:通常 SPA 中前端路由有2種實現方式: window.history location.hash 下面就來介紹下這兩種方式具體怎么實現的 一.history 1.history基本介紹 window.history 對象包含瀏覽器的歷史,window.history 對象在編寫時可不使用 wi
    推薦度:
    標簽: VUE () spa
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产一区精品视频 | 香蕉视频在线免费看 | 中文字幕一区二区在线观看 | 欧美综合在线视频 | 在线免费观看国产 | 国产一区二区久久精品 | 亚洲欧美另类日本 | 国产成人精品一区二区视频 | 日韩精品欧美亚洲高清有无 | 精品日韩欧美国产一区二区 | 日韩国产免费 | 一区二区三区中文字幕 | 制服一区 | 九九九国产在线 | 国产在线视频一区 | 国产成人一区二区三区免费观看 | 日韩美在线| 在线观看亚洲欧美 | 2020精品极品国产色在线观看 | 亚洲视频大全 | 国产91成人精品亚洲精品 | 亚洲欧美另类专区 | 亚洲精品国产综合一线久久 | 亚洲页码 | 亚洲高清视频在线 | 亚洲尹人九九大色香蕉网站 | 国产成人高清亚洲一区91 | 国产日产高清欧美一区二区三区 | 欧美精品一区二区在线观看播放 | 91中文字幕在线 | 国产美女一级毛片 | 欧美视频二区 | 国产在线视频专区 | a毛片在线 | 日韩一级精品久久久久 | 国产欧美中文字幕 | 91精品一区二区 | 国产成人综合久久精品下载 | 欧美日韩亚洲另类 | 另类专区 亚洲 | 国产在线成人一区二区 |