欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue-router 中hash模式和history模式的區(qū)別

 更新時間:2018年07月24日 10:29:47   作者:Chaos  
這篇文章主要介紹了Vue-router 中hash模式和history模式的區(qū)別,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Vue-router 中hash模式和history模式的關系

在vue的路由配置中有mode選項 最直觀的區(qū)別就是在url中 hash 帶了一個很丑的 # 而history是沒有#的

mode:"hash";  
mode:"history"; 

hash模式和history模式的不同

對于vue這類漸進式前端開發(fā)框架,為了構建 SPA(單頁面應用),需要引入前端路由系統(tǒng),這也就是 Vue-Router 存在的意義。前端路由的核心,就在于 —— 改變視圖的同時不會向后端發(fā)出請求。

為了達到這一目的,瀏覽器當前提供了以下兩種支持:

  • hash —— 即地址欄 URL 中的 # 符號(此 hash 不是密碼學里的散列運算)。比如這個 URL:http://www.abc.com/#/hello,hash 的值為 #/hello。它的特點在于:hash 雖然出現在 URL 中,但不會被包括在 HTTP 請求中,對后端完全沒有影響,因此改變 hash 不會重新加載頁面。
  • history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定瀏覽器支持)這兩個方法應用于瀏覽器的歷史記錄棧,在當前已有的 back、forward、go 的基礎之上,它們提供了對歷史記錄進行修改的功能。只是當它們執(zhí)行修改時,雖然改變了當前的 URL,但瀏覽器不會立即向后端發(fā)送請求。
  • 因此可以說,hash 模式和 history 模式都屬于瀏覽器自身的特性,Vue-Router 只是利用了這兩個特性(通過調用瀏覽器提供的接口)來實現前端路由.

使用場景

一般場景下,hash 和 history 都可以,除非你更在意顏值,# 符號夾雜在 URL 里看起來確實有些不太美麗。

如果不想要很丑的 hash,我們可以用路由的 history 模式,這種模式充分利用 history.pushState API 來完成URL 跳轉而無須重新加載頁面。

另外,根據 Mozilla Develop Network 的介紹,調用 history.pushState() 相比于直接修改 hash,存在以下優(yōu)勢:

  • pushState() 設置的新 URL 可以是與當前 URL 同源的任意 URL;而 hash 只可修改 # 后面的部分,因此只能設置與當前 URL 同文檔的 URL;
  • pushState() 設置的新 URL 可以與當前 URL 一模一樣,這樣也會把記錄添加到棧中;而 hash 設置的新值必須與原來不一樣才會觸發(fā)動作將記錄添加到棧中;
  • pushState() 通過 stateObject 參數可以添加任意類型的數據到記錄中;而 hash 只可添加短字符串;
  • pushState() 可額外設置 title 屬性供后續(xù)使用。

當然啦,history 也不是樣樣都好。SPA 雖然在瀏覽器里游刃有余,但真要通過 URL 向后端發(fā)起 HTTP 請求時,兩者的差異就來了。尤其在用戶手動輸入 URL 后回車,或者刷新(重啟)瀏覽器的時候。

個人在接入微信的一個活動開發(fā)過程中 開始使用的hash模式,但是后面后端無法獲取到我#后面的url參數,于是就把參數寫在#前面,但是討論后還是決定去掉這個巨丑的#

于是乎改用history模式,但是開始跑流程的時候是沒問題,但是后來發(fā)現跳轉后刷新或者回跳,會報一個404的錯誤,找不到指定的路由,最后后端去指向正確的路由 加了/hd/xxx 去匹配是否有這個/hd/{:path} 才得以解決

總結

1 hash 模式下,僅 hash 符號之前的內容會被包含在請求中,如 http://www.abc.com,因此對于后端來說,即使沒有做到對路由的全覆蓋,也不會返回 404 錯誤。

2 history 模式下,前端的 URL 必須和實際向后端發(fā)起請求的 URL 一致,如 http://www.abc.com/book/id。如果后端缺少對 /book/id 的路由處理,將返回 404 錯誤。Vue-Router 官網里如此描述:“不過這種模式要玩好,還需要后臺配置支持……所以呢,你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面?!?br />

3 結合自身例子,對于一般的 Vue + Vue-Router + Webpack + XXX 形式的 Web 開發(fā)場景,用 history 模式即可,只需在后端(Apache 或 Nginx)進行簡單的路由配置,同時搭配前端路由的 404 頁面支持。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Vue是怎么渲染template內的標簽內容的

    Vue是怎么渲染template內的標簽內容的

    這篇文章主要介紹了Vue是怎么渲染template內的標簽內容的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 詳解Vue-Router的安裝與使用

    詳解Vue-Router的安裝與使用

    Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,讓構建單頁面應用變得易如反掌。本文介紹下Vue Router的安裝與使用
    2021-06-06
  • Vue3實現簡易音樂播放器組件

    Vue3實現簡易音樂播放器組件

    這篇文章主要為大家詳細介紹了Vue3實現簡易音樂播放器組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 使用Vue3+Vant組件實現App搜索歷史記錄功能(示例代碼)

    使用Vue3+Vant組件實現App搜索歷史記錄功能(示例代碼)

    最近接了個項目需要開發(fā)一個app項目,由于是第一次接觸這種app開發(fā),經過一番思考,決定使用Vue3+Vant前端組件的模式進行開發(fā),下面把問題分析及實現代碼分享給大家,需要的朋友參考下吧
    2021-06-06
  • VUE 實現滾動監(jiān)聽 導航欄置頂的方法

    VUE 實現滾動監(jiān)聽 導航欄置頂的方法

    今天小編就為大家分享一篇VUE 實現滾動監(jiān)聽 導航欄置頂的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Pinia介紹及工作原理解析

    Pinia介紹及工作原理解析

    這篇文章主要為大家介紹了Pinia介紹及工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • element-ui 實現響應式導航欄的示例代碼

    element-ui 實現響應式導航欄的示例代碼

    這篇文章主要介紹了element-ui 實現響應式導航欄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 詳解vue axios中文文檔

    詳解vue axios中文文檔

    本篇文章主要介紹了詳解axios中文文檔,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Vue使用NProgress的操作過程解析

    Vue使用NProgress的操作過程解析

    這篇文章主要介紹了Vue使用NProgress的操作過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • vue.js+element-ui動態(tài)配置菜單的實例

    vue.js+element-ui動態(tài)配置菜單的實例

    今天小編就為大家分享一篇vue.js+element-ui動態(tài)配置菜單的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論