前端路由是在保證只有一個HTML頁面的狀況下,經過對每一個視圖展現形式匹配一個特殊的url來實現所謂的切換效果。不會從新向服務端發送請求,也不會跳轉頁面。不管是刷新、前進、仍是後退,均可以經過特殊url實現。html
單頁web應用(single page web application,SPA)前端
它只有一個HTML頁面。它的核心是更新視圖不須要從新請求頁面。 所謂的頁面跳轉,多個頁面之間的切換是利用JS動態的變換HTML的內容,加載的時候不是加載整個頁面,而是某個指定的容器中的內容。vue
舉栗子:阿呆有一個水壺,剛開始裝的是牛奶,過一下子裝的是果汁,再過一會又是開水。可水壺仍是一個水壺!web
SPA的缺點: api
一、沒法記住用戶的操做記錄,瀏覽器
二、且只有一個url,對SEO不友好。bash
🍓前端路由的重要的做用服務器
一、能夠在改變url的時候不會向服務器發送請求。app
二、能夠監聽到url的改變。ui
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/city',
name: 'City',
component: City
},
{
path: '/detail/:id',
name: 'Detail',
component: Detail
},
{
path: '/search',
name: 'Search',
component: Search
}
]
})
複製代碼
--hash模式下的url
http://localhost:8080/#/
http://localhost:8080/#/detail/1
複製代碼
這裏的 hash 就是指 url 後的 # 號以及後面的字符。好比說 "www.baidu.com/#hashhash" ,其中 "#hashhash" 就是咱們指望的 hash 值。 hash 值的變化不會致使瀏覽器像服務器發送請求,並且
hash 的改變
會觸發 hashChange 事件,瀏覽器的前進後退也能對其進行控制
,因此在 H5 的 history 模式出現以前,基本都是使用 hash 模式來實現前端路由。
如下是我我的項目中的頁面跳轉 history模式
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/login',
name: 'login',
component: ()=>import('./views/Login.vue'),
},
{
path: '/register',
name: 'register',
component: ()=>import('./views/Register.vue'),
},
{
path: '/information',
name: 'information',
component: ()=>import('./views/Information.vue'),
},
{
path: '/chat',
name: 'chat',
component: ()=>import('./views/ChatView.vue'),
}
]
});
複製代碼
在 HTML5 以前,瀏覽器就已經有了 history 對象。但在早期的 history 中只能用於多頁面的跳轉。
重要)在 HTML5 的規範中,history 新增瞭如下幾個 API:
history.pushState(); // 添加新的狀態到歷史狀態棧
history.replaceState(); // 用新的狀態代替當前狀態
history.state // 返回當前狀態對象
history.pushState() 和 history.replaceState() 的區別?
history.pushState() 在保留現有歷史記錄的同時,將 url 加入到歷史記錄中。 history.replaceState() 會將歷史記錄中的當前頁面歷史替換爲 url。 因爲 history.pushState() 和 history.replaceState() 能夠改變 url 同時,不會刷新頁面,因此在 HTML5 中的 histroy 具有了實現前端路由的能力。
但須要注意的是,history 在修改 url 後,雖然頁面並不會刷新,但咱們在手動刷新,或經過 url 直接進入應用的時候, 服務端是沒法識別這個 url 的。
由於咱們是單頁應用,只有一個 html 文件,服務端在處理其餘路徑的 url 的時候,就會出現404的狀況。 因此,若是要應用 history 模式,須要在服務端增長一個覆蓋全部狀況的候選資源:若是 URL 匹配不到任何靜態資源,則應該返回單頁應用的 html 文件。
popstate
在history模式中與hash模式的hashchange對應的是popState。popstate是在瀏覽器回退前進或者js的 back() go() forward()方法的時候纔會觸發。
<button @click="$router.go(-1)">返回</button> //返回上一級
<button @click="$router.back()">返回</button> //返回上一級
<button @click="$router.forward()">返回</button> //切換到下一級
那麼你們就會有疑問——若是隻能經過js的api才能夠觸發popState
, 那pushState
和replaceState
怎麼被popState
「注意」到?
答案:能夠經過a標籤改變url,檢測到url發生改變。 大體大代碼以下:
hash模式和history模式對比
一、hash 模式相比於 history 模式的優勢:
二、hash 模式相比於 history 模式的缺點: