乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      哈希路由(hash模式)和歷史路由(history模式)的區(qū)別

       印度阿三17 2020-01-29

      隨著 ajax 的使用越來越廣泛,前端的頁面邏輯開始變得越來越復雜,特別是spa的興起,前端路由系統(tǒng)隨之開始流行。

      從用戶的角度看,前端路由主要實現(xiàn)了兩個功能(使用ajax更新頁面狀態(tài)的情況下):

      1. 記錄當前頁面的狀態(tài)(保存或分享當前頁的url,再次打開該url時,網頁還是保存(分享)時的狀態(tài));
      2. 可以使用瀏覽器的前進后退功能(如點擊后退按鈕,可以使頁面回到使用ajax更新頁面之前的狀態(tài),url也回到之前的狀態(tài));

      作為開發(fā)者,要實現(xiàn)這兩個功能,我們需要做到:

      1. 改變url且不讓瀏覽器向服務器發(fā)出請求;
      2. 監(jiān)測 url 的變化;
      3. 截獲 url 地址,并解析出需要的信息來匹配路由規(guī)則。

      我們路由常用的hash模式和history模式實際上就是實現(xiàn)了上面的功能。

      hash模式

      這里的 hash 就是指 url 尾巴后的 # 號以及后面的字符。這里的 # 和 css 里的 # 是一個意思。hash 也 稱作 錨點,本身是用來做頁面定位的,她可以使對應 id 的元素顯示在可視區(qū)域內。

      由于 hash 值變化不會導致瀏覽器向服務器發(fā)出請求,而且 hash 改變會觸發(fā) hashchange 事件,瀏覽器的進后退也能對其進行控制,所以人們在 html5 的 history 出現(xiàn)前,基本都是使用 hash 來實現(xiàn)前端路由的。

      使用到的api:

      1 window.location.hash = 'qq' // 設置 url 的 hash,會在當前url后加上 '#qq'
      2 
      3 var hash = window.location.hash // '#qq'  
      4 
      5 window.addEventListener('hashchange', function(){ 
      6     // 監(jiān)聽hash變化,點擊瀏覽器的前進后退會觸發(fā)
      7 })

      ?

      history模式

      已經有 hash 模式了,而且 hash 能兼容到IE8, history 只能兼容到 IE10,為什么還要搞個 history 呢?
      首先,hash 本來是拿來做頁面定位的,如果拿來做路由的話,原來的錨點功能就不能用了。其次,hash 的傳參是基于 url 的,如果要傳遞復雜的數(shù)據(jù),會有體積的限制,而 history 模式不僅可以在url里放參數(shù),還可以將數(shù)據(jù)存放在一個特定的對象中。
      最重要的一點:

      如果不想要很丑的 hash,我們可以用路由的 history 模式
      —— 引用自 vueRouter文檔

      相關API:

       1 window.history.pushState(state, title, url) 
       2 // state:需要保存的數(shù)據(jù),這個數(shù)據(jù)在觸發(fā)popstate事件時,可以在event.state里獲取
       3 // title:標題,基本沒用,一般傳 null
       4 // url:設定新的歷史記錄的 url。新的 url 與當前 url 的 origin 必須是一樣的,否則會拋出錯誤。url可以是絕對路徑,也可以是相對路徑。
       5 //如 當前url是 https://www.baidu.com/a/,執(zhí)行history.pushState(null, null, './qq/'),則變成 https://www.baidu.com/a/qq/,
       6 //執(zhí)行history.pushState(null, null, '/qq/'),則變成 https://www.baidu.com/qq/
       7 
       8 window.history.replaceState(state, title, url)
       9 // 與 pushState 基本相同,但她是修改當前歷史記錄,而 pushState 是創(chuàng)建新的歷史記錄
      10 
      11 window.addEventListener("popstate", function() {
      12     // 監(jiān)聽瀏覽器前進后退事件,pushState 與 replaceState 方法不會觸發(fā)              
      13 });
      14 
      15 window.history.back() // 后退
      16 window.history.forward() // 前進
      17 window.history.go(1) // 前進一步,-2為后退兩步,window.history.lengthk可以查看當前歷史堆棧中頁面的數(shù)量

      ?

      history 模式改變 url 的方式會導致瀏覽器向服務器發(fā)送請求,這不是我們想看到的,我們需要在服務器端做處理:如果匹配不到任何靜態(tài)資源,則應該始終返回同一個 html 頁面。

      來源:https://www./content-4-625201.html

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多