區(qū)分vue-router的hash和history模式
一、概念
為了構建 SPA(單頁面應用),需要引入前端路由系統,這也就是 Vue-Router 存在的意義。
前端路由的核心,就在于:改變視圖的同時不會向后端發(fā)出請求。
為了達到這種目的,瀏覽器當前提供了以下兩種支持:
1.hash——即地址欄 URL 中的 # 符號(此 hash 不是密碼學里的散列運算)。
比如這個 URL:http://www.abc.com/#/hello,hash 的值為 #/hello。
它的特點在于:hash 雖然出現在 URL 中,但不會被包括在 HTTP 請求中,對后端完全沒有影響,因此改變 hash 不會重新加載頁面。
2.history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。
這兩個方法應用于瀏覽器的歷史記錄棧,在當前已有的 back、forward、go 的基礎之上,它們提供了對歷史記錄進行修改的功能。
只是當它們執(zhí)行修改時,雖然改變了當前的 URL,但瀏覽器不會立即向后端發(fā)送請求。
二、hash模式
hash模式背后的原理是onhashchange事件,可以在window對象上監(jiān)聽這個事件:
window.onhashchange = function(event){
console.log(event.oldURL, event.newURL);
let hash = location.hash.slice(1);
document.body.style.color = hash;
}
這段可以在hash改變的時候改變字體顏色。
hash發(fā)生變化的url都會被瀏覽器記錄下來,從而你會發(fā)現瀏覽器的前進后退都可以使用了,同時點擊后退時,頁面字體顏色也會發(fā)生變化。
這樣一來雖然沒有向后端發(fā)送請求,但是頁面狀態(tài)和url關聯在了一起,這就是前端路由。
三、history模式
隨著history api的到來,前端路由開始進化了,前面的onhashchange,你只能改變#后面的url片段,而history api則給了前端完全的自由。
history api可以分為兩大部分,切換和修改。
切換歷史狀態(tài)包括back、forward、go三個方法,對應瀏覽器的前進,后退,跳轉操作。
修改歷史狀態(tài)包括了pushState、replaceState兩個方法,這兩個方法接收三個參數:stateObj,title,url
history.pushState({color:'red'}, 'red', 'red')
history.back();
setTimeout(function(){
history.forward();
},0)
window.onpopstate = function(event){
console.log(event.state)
if(event.state && event.state.color === 'red'){
document.body.style.color = 'red';
}
}
通過pushstate把頁面的狀態(tài)保存在state對象中,當頁面的url再變回這個url時,可以通過event.state取到這個state對象,從而可以對頁面狀態(tài)進行還原,這里的頁面狀態(tài)就是頁面字體顏色。
其實滾動條的位置,閱讀進度,組件的開關的這些頁面狀態(tài)都可以存儲到state的里面。
四、history模式的問題
通過history api,我們丟掉了丑陋的#,但是它也有個問題:不怕前進,不怕后退,就怕刷新,f5,(如果后端沒有準備的話),因為刷新是實實在在地去請求服務器的。
在hash模式下,前端路由修改的是#中的信息,而瀏覽器請求時是不帶它的,所以沒有問題。但是在history下,你可以自由的修改path,當刷新時,如果服務器中沒有相應的響應或者資源,會刷出一個404來。
所以呢,你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。
如果使用nginx,后端配置如下:
location / {
try_files $uri $uri/ /index.html;
}
以上就是區(qū)分vue-router的hash和history模式的詳細內容,更多關于vue-router hash和history模式的資料請關注腳本之家其它相關文章!
相關文章
Electron+vue從零開始打造一個本地播放器的方法示例
這篇文章主要介紹了Electron+vue從零開始打造一個本地播放器的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
vue中element-ui不能修改el-input框,或是不能修改某些值問題
這篇文章主要介紹了vue中element-ui不能修改el-input框,或是不能修改某些值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

