vue3中關(guān)于路由hash與History的設(shè)置
關(guān)于路由hash與History的設(shè)置
1、history 關(guān)鍵字:createWebHistory
import { createRouter, createWebHistory } from 'vue-router' const routes = [ { ? path: '/userinfo', ? name: 'UserInfo', ? component: () => import('../views/UserInfo.vue') }] const router = createRouter({ ? history: createWebHistory(process.env.BASE_URL), ? routes }) export default router
2、hash 關(guān)鍵字:createWebHashHistory
import { createRouter, createWebHashHistory } from 'vue-router' const routes = [{ ? path: '/userinfo', ? name: 'UserInfo', ? component: () => import('../views/UserInfo.vue') }] const router = createRouter({ ? history: createWebHashHistory(), ? routes }) export default router
路由中hash和history模式區(qū)別
Vue-Router有兩種模式:hash模式和history模式。默認(rèn)的路由模式是hash模式。
1、hash模式
hash模式是開發(fā)中默認(rèn)的模式,也稱作錨點(diǎn),它的URL帶著一個(gè)#,例如:www.abc.com/#/vue,它的hash值就是#/vue。
特點(diǎn):
hash值會(huì)出現(xiàn)在URL里面,但是不會(huì)出現(xiàn)在HTTP請(qǐng)求中,對(duì)后端沒有影響。所以改變hash值不會(huì)重新加載頁(yè)面。
這種模式的瀏覽器支持度很好,低版本的IE瀏覽器也支持這種模式。
hash路由被稱為是前端路由,已經(jīng)成為SPA(單頁(yè)面應(yīng)用)的標(biāo)配。
原理:
hash模式的主要原理就是onhashchange()事件:
window.onhashchange = function(event){ ?? ?console.log(event.oldURL, event.newURL); ?? ?let hash = location.hash.slice(1); }
使用onhashchange()事件的好處就是,在頁(yè)面的hash值發(fā)生變化時(shí),無(wú)需向后端發(fā)起請(qǐng)求,window就可以監(jiān)聽事件的改變,并按規(guī)則加載相應(yīng)的代碼。除此之外,hash值變化對(duì)應(yīng)的URL都會(huì)被瀏覽器記錄下來(lái),這樣瀏覽器就能實(shí)現(xiàn)頁(yè)面的前進(jìn)和后退。雖然是沒有請(qǐng)求后端服務(wù)器,但是頁(yè)面的hash值和對(duì)應(yīng)的URL關(guān)聯(lián)起來(lái)了。
獲取頁(yè)面hash變化的方法:
(1)監(jiān)聽$route的變化:
// 監(jiān)聽,當(dāng)路由發(fā)生變化的時(shí)候執(zhí)行 watch: { ? $route: { ? ? handler: function(val, oldVal){ ? ? ? console.log(val); ? ? }, ? ? // 深度觀察監(jiān)聽 ? ? deep: true ? } },
(2)通過(guò)window.location.hash讀取#值:
window.location.hash 的值可讀可寫,讀取來(lái)判斷狀態(tài)是否改變,寫入時(shí)可以在不重載網(wǎng)頁(yè)的前提下,添加一條歷史訪問記錄。
2、history模式
history模式直接指向history對(duì)象,它表示當(dāng)前窗口的瀏覽歷史,history對(duì)象保存了當(dāng)前窗口訪問過(guò)的所有頁(yè)面網(wǎng)址。URL中沒有#,它使用的是傳統(tǒng)的路由分發(fā)模式,即用戶在輸入一個(gè)URL時(shí),服務(wù)器會(huì)接收這個(gè)請(qǐng)求,并解析這個(gè)URL,然后做出相應(yīng)的邏輯處理。
特點(diǎn):
當(dāng)使用history模式時(shí),URL就像這樣:hhh.com/user/id。相比hash模式更加好看。
雖然history模式不需要#。但是,它也有自己的缺點(diǎn),就是在刷新頁(yè)面的時(shí)候,如果沒有相應(yīng)的路由或資源,就會(huì)刷出404來(lái)。
history api可以分為兩大部分,切換歷史狀態(tài) 和 修改歷史狀態(tài):
修改歷史狀態(tài):
包括了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法,這兩個(gè)方法應(yīng)用于瀏覽器的歷史記錄棧,提供了對(duì)歷史記錄進(jìn)行修改的功能。只是當(dāng)他們進(jìn)行修改時(shí),雖然修改了url,但瀏覽器不會(huì)立即向后端發(fā)送請(qǐng)求。如果要做到改變url但又不刷新頁(yè)面的效果,就需要前端用上這兩個(gè)API。
切換歷史狀態(tài):
包括forward()、back()、go()三個(gè)方法,對(duì)應(yīng)瀏覽器的前進(jìn),后退,跳轉(zhuǎn)操作。
配置:
想要設(shè)置成history模式,就要進(jìn)行以下的配置(后端也要進(jìn)行配置):
const router = new VueRouter({ ? mode: 'history', ? routes: [...] })
3、兩者對(duì)比
調(diào)用 history.pushState() 相比于直接修改 hash,存在以下優(yōu)勢(shì):
pushState() 設(shè)置的新 URL 可以是與當(dāng)前 URL 同源的任意 URL;而 hash 只可修改 # 后面的部分,因此只能設(shè)置與當(dāng)前 URL 同文檔的 URL。
pushState() 設(shè)置的新 URL 可以與當(dāng)前 URL 一模一樣,這樣也會(huì)把記錄添加到棧中;而 hash 設(shè)置的新值必須與原來(lái)不一樣才會(huì)觸發(fā)動(dòng)作將記錄添加到棧中。
pushState() 通過(guò) stateObject 參數(shù)可以添加任意類型的數(shù)據(jù)到記錄中;而 hash 只可添加短字符串。
pushState() 可額外設(shè)置 title 屬性供后續(xù)使用。
hash模式下,僅hash符號(hào)之前的url會(huì)被包含在請(qǐng)求中,后端如果沒有做到對(duì)路由的全覆蓋,也不會(huì)返回404錯(cuò)誤;history模式下,前端的url必須和實(shí)際向后端發(fā)起請(qǐng)求的url一致,如果沒有對(duì)用的路由處理,將返回404錯(cuò)誤。
小結(jié):
hash模式URL上帶有#,僅 hash 符號(hào)之前的內(nèi)容會(huì)被包含在請(qǐng)求中,如 www.hhh.com,因此對(duì)于后端來(lái)說(shuō),即使沒有做到對(duì)路由的全覆蓋,也不會(huì)返回 404 錯(cuò)誤。
hash模式URL上沒有#,前端的 URL 必須和實(shí)際向后端發(fā)起請(qǐng)求的 URL 一致,如 www.hhh.com/user/id。如果后端缺少對(duì) /use/id 的路由處理,將返回 404 錯(cuò)誤。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue+axios 前端實(shí)現(xiàn)的常用攔截的代碼示例
這篇文章主要介紹了vue+axios 前端實(shí)現(xiàn)的常用攔截的代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08vue數(shù)據(jù)操作之點(diǎn)擊事件實(shí)現(xiàn)num加減功能示例
這篇文章主要介紹了vue數(shù)據(jù)操作之點(diǎn)擊事件實(shí)現(xiàn)num加減功能,結(jié)合實(shí)例形式分析了vue.js事件響應(yīng)及數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2019-01-01vue-virtual-scroll-list虛擬組件實(shí)現(xiàn)思路詳解
這篇文章主要給大家介紹了關(guān)于vue-virtual-scroll-list虛擬組件實(shí)現(xiàn)思路的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02vue中element 上傳功能的實(shí)現(xiàn)思路
這篇文章主要介紹了vue中element 的上傳功能的實(shí)現(xiàn)思路,本文大概通過(guò)兩種實(shí)現(xiàn)思路,具體內(nèi)容詳情大家跟隨腳本之家小編一起看看吧2018-07-07VUE項(xiàng)目中調(diào)用高德地圖的全流程講解
這篇文章主要介紹了VUE項(xiàng)目中調(diào)用高德地圖的全流程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08vue3+typescript實(shí)現(xiàn)圖片懶加載插件
這篇文章主要介紹了vue3+typescript實(shí)現(xiàn)圖片懶加載插件,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-10-10詳解如何使用Vue實(shí)現(xiàn)圖像識(shí)別和人臉對(duì)比
隨著人工智能的發(fā)展,圖像識(shí)別和人臉識(shí)別技術(shù)已經(jīng)被廣泛應(yīng)用于各種應(yīng)用程序中,Vue為我們提供了許多實(shí)用工具和庫(kù),可以幫助我們?cè)趹?yīng)用程序中進(jìn)行圖像識(shí)別和人臉識(shí)別,在本文中,我們將介紹如何使用Vue進(jìn)行圖像識(shí)別和人臉對(duì)比,需要的朋友可以參考下2023-06-06