Vue路由模式中的hash和history模式詳細(xì)介紹
1. 路由概念
路由的本質(zhì)就是一種對(duì)應(yīng)關(guān)系,根據(jù)不同的URL請(qǐng)求,返回對(duì)應(yīng)不同的資源。那么url地址和真實(shí)的資源之間就有一種對(duì)應(yīng)的關(guān)系,就是路由。
SPA(Single Page Application)單頁面應(yīng)用程序,基于前端路由而起:整個(gè)網(wǎng)站只有一個(gè)頁面,通過監(jiān)聽地址欄中的變化事件,來通過Ajax局部更新內(nèi)容信息顯示、同時(shí)支持瀏覽器地址欄的前進(jìn)和后退操作。
前端路由有兩種模式:hash 模式和 history 模式。
2. hash模式
概述:
hash 路由模式是這樣的:http://xxx.abc.com/#/xx。 有帶#號(hào),后面就是 hash 值的變化。改變后面的 hash 值,它不會(huì)向服務(wù)器發(fā)出請(qǐng)求,因此也就不會(huì)刷新頁面。并且每次 hash 值發(fā)生改變的時(shí)候,會(huì)觸發(fā) hashchange 事件。因此我們可以通過監(jiān)聽該事件,來知道 hash 值發(fā)生了哪些變化。
window.addEventListener('hashchange', ()=>{
// 通過 location.hash 獲取到最新的 hash 值
console.log(location.hash);
});
使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hash路由</title>
</head>
<body>
<ul>
<li>
<!-- 通過標(biāo)簽導(dǎo)航 聲明式導(dǎo)航 -->
<a href="#/home" rel="external nofollow" >首頁</a>
<!-- location.href='#/home' js方式進(jìn)行導(dǎo)航切換 編程式導(dǎo)航 -->
</li>
<li>
<a href="#/about" rel="external nofollow" >關(guān)于</a>
</li>
</ul>
<div id="routerView"></div>
<script>
const routerRender = () => {
// 每次都置空hash
let html = ''
// 根據(jù)地址欄hash值的不同返回對(duì)應(yīng)的資源
try {
// 如果hash值為空就給一個(gè)home
let hash = location.hash || '#/home'
html = component[hash.slice(2)]()
} catch (error) {
html = `<div>404</div>`
}
// 渲染到頁面上
document.getElementById('routerView').innerHTML = html
}
const component = {
home() {
return `<div>home頁面</div>`
},
about() {
return '<div>關(guān)于頁面</div>'
}
}
window.onload = function () {
routerRender()
}
// 事件,監(jiān)聽地址欄中的hash值變化,實(shí)現(xiàn)回退
window.addEventListener('hashchange', routerRender)
</script>
</body>
</html>
注意:hash 模式既可以通過聲明式導(dǎo)航,也可以通過編程式導(dǎo)航,上面的案例展示的是聲明式導(dǎo)航。而下面將要講到的 history 模式只能通過編程式導(dǎo)航實(shí)現(xiàn),因?yàn)?history 是 js 對(duì)象。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):hash模式兼容性很強(qiáng),刷新瀏覽器,頁面還會(huì)存在
缺點(diǎn):地址欄不優(yōu)雅,有#存在,不利于seo,記憶困難
3. history路由模式
概述:
HTML5的History API為瀏覽器的全局history對(duì)象增加了該擴(kuò)展方法。它是一個(gè)瀏覽器(bom)的一個(gè)接口,在window對(duì)象中提供了onpopstate事件來監(jiān)聽歷史棧的改變,只要?dú)v史棧有信息發(fā)生改變的話,就會(huì)觸發(fā)該事件。
history.pushState({},title,url); // 向歷史記錄中追加一條記錄
history.replaceState({},title,url); // 替換當(dāng)前頁在歷史記錄中的信息。
window.addEventListener('popstate', function(event) {
console.log(event)
})
使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>history模式</title>
</head>
<body>
<ul>
<li>
<a href="/home" rel="external nofollow" >首頁</a>
</li>
<li>
<a href="/about" rel="external nofollow" >關(guān)于</a>
</li>
</ul>
<div id="routerView"></div>
<script>
const component = {
home() {
return `<div>home頁面</div>`
},
about() {
return '<div>關(guān)于頁面</div>'
}
}
const routerRender = pathname => {
let html = ''
try {
html = component[pathname]()
} catch (error) {
html = `<div>404</div>`
}
document.getElementById('routerView').innerHTML = html
}
// history模式,它的路由導(dǎo)航,只能通過js來完成 , history它是js對(duì)象
// 給鏈接添加點(diǎn)擊事件
document.querySelectorAll('a').forEach(node => {
node.addEventListener('click', function (evt) {
// 阻止a標(biāo)簽的默認(rèn)跳轉(zhuǎn)行為
evt.preventDefault()
// 跳轉(zhuǎn)到指定的地址,能回退
// history.pushState
// 跳轉(zhuǎn)到指定持址,不能回退
// history.replaceState
history.pushState({}, null, this.href)
// 渲染
routerRender(this.href.match(/\/(\w+)$/)[1])
})
})
// 在網(wǎng)頁加載完畢后立刻執(zhí)行的操作,即當(dāng) HTML 文檔加載完畢后,立刻渲染 home 中的標(biāo)簽
window.onload = () => {
routerRender('home')
}
// 回退
window.addEventListener('popstate', function () {
routerRender(location.pathname.slice(1))
})
</script>
</body>
</html>
優(yōu)缺點(diǎn):
缺點(diǎn):history模式,兼容性較差,刷新頁面,頁面會(huì)404,需要服務(wù)器端配置支持
優(yōu)點(diǎn):地址欄更優(yōu)雅,方便記憶,有利于有seo
到此這篇關(guān)于Vue路由模式中的hash和history模式詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Vue路由模式 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue.js獲取被選擇的option的value和text值方法
今天小編就為大家分享一篇Vue.js獲取被選擇的option的value和text值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Vue中使用Printjs插件實(shí)現(xiàn)打印功能
Print.js 主要是為了幫助我們直接在我們的應(yīng)用程序中打印 PDF 文件,無需離開界面,也無需使用嵌入,這篇文章主要介紹了Vue中使用Printjs插件實(shí)現(xiàn)打印功能,需要的朋友可以參考下2022-08-08
Vue3中v-if和v-for優(yōu)先級(jí)實(shí)例詳解
Vue.js中使用最多的兩個(gè)指令就是v-if和v-for,下面這篇文章主要給大家介紹了關(guān)于Vue3中v-if和v-for優(yōu)先級(jí)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
解決echarts中橫坐標(biāo)值顯示不全(自動(dòng)隱藏)問題
這篇文章主要介紹了解決echarts中橫坐標(biāo)值顯示不全(自動(dòng)隱藏)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue前端左側(cè)菜單右側(cè)內(nèi)容的網(wǎng)站界面制作過程
這篇文章主要介紹了使用Vue和ElementUI制作一個(gè)帶有左側(cè)菜單和右側(cè)內(nèi)容區(qū)的網(wǎng)站頁面的過程,文中通過CSS樣式和深度作用符,實(shí)現(xiàn)了頁面的美化和功能的完善,需要的朋友可以參考下2025-02-02
Vue監(jiān)聽數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解
今天小編就為大家分享一篇Vue監(jiān)聽數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
基于vue-cli vue-router搭建底部導(dǎo)航欄移動(dòng)前端項(xiàng)目
這篇文章主要介紹了基于vue-cli vue-router搭建底部導(dǎo)航欄移動(dòng)前端項(xiàng)目,項(xiàng)目中主要用了Flex布局,以及viewport相關(guān)知識(shí),已達(dá)到適應(yīng)各終端屏幕的目的。需要的朋友可以參考下2018-02-02
vue3與webpack5安裝element-plus樣式webpack編譯報(bào)錯(cuò)問題解決
這篇文章主要介紹了vue3與webpack5安裝element-plus樣式webpack編譯報(bào)錯(cuò),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
在導(dǎo)入.vue文件的時(shí)候,ts報(bào)錯(cuò)提示:找不到模塊“@/Layout/index.vue”或其相應(yīng)的類型聲明問題
這篇文章主要介紹了在導(dǎo)入.vue文件的時(shí)候,ts報(bào)錯(cuò)提示:找不到模塊“@/Layout/index.vue”或其相應(yīng)的類型聲明問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

