在學習vue-router時,瞭解到前端路由的兩種模式,本文就前端路由,及其兩種模式的原理和使用場景,作一個整理總結。html
路由這個概念最早是後端出現的,簡單來講路由就是用來跟後端服務器進行交互的一種方式,經過不一樣的路徑,來請求不一樣的資源,請求不一樣的頁面是路由的其中一種功能。前端
前端路由的出現要從 ajax 開始,有了 Ajax 後,用戶交互就不用每次都刷新頁面,體驗帶來了極大的提高。隨着技術的發展,簡單的異步已經不能知足需求,因此異步的更高級體驗出現了——SPA(單頁應用)。 SPA 的出現大大提升了 WEB 應用的交互體驗。在與用戶的交互過程當中,再也不須要從新刷新頁面,獲取數據也是經過 Ajax 異步獲取,頁面顯示變的更加流暢。 但因爲 SPA 中用戶的交互是經過 JS 改變 HTML 內容來實現的,頁面自己的 url 並無變化,這致使了兩個問題:vue
前端路由就是爲了解決上述問題而出現的。node
簡單的說,就是在保證只有一個 HTML 頁面,且與用戶交互時不刷新和跳轉頁面的同時,爲 SPA 中的每一個視圖展現形式匹配一個特殊的 url。在刷新、前進、後退和SEO時均經過這個特殊的 url 來實現。 爲實現這一目標,咱們須要作到如下二點:ajax
接下來要介紹的 hash 模式和 history 模式,就是實現了上面的功能。vue-router
//html
<ul id="menu">
<li>
<a href="#index">首頁</a>
</li>
<li>
<a href="#news">資訊</a>
</li>
<li>
<a href="#user">我的中心</a>
</li>
</ul>
<div id="app"></div>
//js
function hashChange(e){
let app = document.getElementById('app')
switch (location.hash) {
case '#index':
app.innerHTML = '<h1>這是首頁內容</h1>'
break
case '#news':
app.innerHTML = '<h1>這是新聞內容</h1>'
break
case '#user':
app.innerHTML = '<h1>這是我的中心內容</h1>'
break
default:
app.innerHTML = '<h1>404</h1>'
}
}
window.onhashchange = hashChange
hashChange()
複製代碼
//html
<ul id="menu">
<li>
<a href="/index">首頁</a>
</li>
<li>
<a href="/news">資訊</a>
</li>
<li>
<a href="/user">我的中心</a>
</li>
</ul>
<div id="app"></div>
//js
document.querySelector('#menu').addEventListener('click',function (e) {
if(e.target.nodeName ==='A'){
e.preventDefault()
let path = e.target.getAttribute('href') //獲取超連接的href,改成pushState跳轉,不刷新頁面
window.history.pushState({},'',path) //修改瀏覽器中顯示的url地址
render(path) //根據path,更改頁面內容
}
})
function render(path) {
let app = document.getElementById('app')
switch (path) {
case '/index':
app.innerHTML = '<h1>這是首頁內容</h1>'
break
case '/news':
app.innerHTML = '<h1>這是新聞內容</h1>'
break
case '/user':
app.innerHTML = '<h1>這是我的中心內容</h1>'
break
default:
app.innerHTML = '<h1>404</h1>'
}
}
window.onpopstate = function (e) {
render(location.pathname)
}
render('/index')
複製代碼
參考連接:後端